From fc5d5711bc78cfe0ce537a33ead9bc78b031b263 Mon Sep 17 00:00:00 2001 From: bluhm Date: Wed, 10 Apr 2024 22:24:07 +0000 Subject: [PATCH] Make TCP debug code MP safe. Protect the global variables in TCP debug code with global mutex. Add a missing include and also fix the -Wunused-but-set-variable warning. OK mvs@ --- sys/netinet/tcp_debug.c | 43 ++++++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/sys/netinet/tcp_debug.c b/sys/netinet/tcp_debug.c index ae784dcec98..751e69a8975 100644 --- a/sys/netinet/tcp_debug.c +++ b/sys/netinet/tcp_debug.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tcp_debug.c,v 1.31 2024/01/11 13:49:49 bluhm Exp $ */ +/* $OpenBSD: tcp_debug.c,v 1.32 2024/04/10 22:24:07 bluhm Exp $ */ /* $NetBSD: tcp_debug.c,v 1.10 1996/02/13 23:43:36 christos Exp $ */ /* @@ -79,6 +79,7 @@ #include #include #include +#include #include #include @@ -98,12 +99,23 @@ #include #endif /* INET6 */ +#ifdef TCPDEBUG +#include +#endif + +/* + * Locks used to protect struct members in this file: + * D TCP debug global mutex + */ + +struct mutex tcp_debug_mtx = MUTEX_INITIALIZER(IPL_SOFTNET); + #ifdef TCPDEBUG int tcpconsdebug = 0; #endif -struct tcp_debug tcp_debug[TCP_NDEBUG]; -int tcp_debx; +struct tcp_debug tcp_debug[TCP_NDEBUG]; /* [D] */ +int tcp_debx; /* [D] */ /* * Tcp debug routines @@ -113,14 +125,20 @@ tcp_trace(short act, short ostate, struct tcpcb *tp, struct tcpcb *otp, caddr_t headers, int req, int len) { #ifdef TCPDEBUG + struct tcphdr *th; tcp_seq seq, ack; int flags; #endif int pf = PF_UNSPEC; - struct tcp_debug *td = &tcp_debug[tcp_debx++]; - struct tcpiphdr *ti = (struct tcpiphdr *)headers; - struct tcpipv6hdr *ti6 = (struct tcpipv6hdr *)headers; - struct tcphdr *th; + struct tcp_debug *td; + struct tcpiphdr *ti; + struct tcpipv6hdr *ti6; + + mtx_enter(&tcp_debug_mtx); + + td = &tcp_debug[tcp_debx++]; + ti = (struct tcpiphdr *)headers; + ti6 = (struct tcpipv6hdr *)headers; if (tcp_debx == TCP_NDEBUG) tcp_debx = 0; @@ -153,13 +171,17 @@ tcp_trace(short act, short ostate, struct tcpcb *tp, struct tcpcb *otp, switch (pf) { #ifdef INET6 case PF_INET6: +#ifdef TCPDEBUG th = &ti6->ti6_t; +#endif td->td_ti6 = *ti6; td->td_ti6.ti6_plen = len; break; #endif /* INET6 */ case PF_INET: +#ifdef TCPDEBUG th = &ti->ti_t; +#endif td->td_ti = *ti; td->td_ti.ti_len = len; break; @@ -172,7 +194,7 @@ tcp_trace(short act, short ostate, struct tcpcb *tp, struct tcpcb *otp, td->td_req = req; #ifdef TCPDEBUG if (tcpconsdebug == 0) - return; + goto done; if (otp) printf("%p %s:", otp, tcpstates[ostate]); else @@ -218,11 +240,14 @@ tcp_trace(short act, short ostate, struct tcpcb *tp, struct tcpcb *otp, /* print out internal state of tp !?! */ printf("\n"); if (tp == NULL) - return; + goto done; printf("\trcv_(nxt,wnd,up) (%x,%lx,%x) snd_(una,nxt,max) (%x,%x,%x)\n", tp->rcv_nxt, tp->rcv_wnd, tp->rcv_up, tp->snd_una, tp->snd_nxt, tp->snd_max); printf("\tsnd_(wl1,wl2,wnd) (%x,%x,%lx)\n", tp->snd_wl1, tp->snd_wl2, tp->snd_wnd); + + done: #endif /* TCPDEBUG */ + mtx_leave(&tcp_debug_mtx); } -- 2.20.1