diff --git a/sys/netinet/tcp_debug.c b/sys/netinet/tcp_debug.c index 9cf03349af30..d84c37afe56d 100644 --- a/sys/netinet/tcp_debug.c +++ b/sys/netinet/tcp_debug.c @@ -53,6 +53,7 @@ #include #include #include +#include #include #include @@ -96,6 +97,11 @@ tcp_trace(act, ostate, tp, ipgen, th, req) #ifdef INET6 isipv6 = (ipgen != NULL && ((struct ip *)ipgen)->ip_v == 6) ? 1 : 0; #endif /* INET6 */ + td->td_family = +#ifdef INET6 + (isipv6 != 0) ? AF_INET6 : +#endif + AF_INET; if (tcp_debx == TCP_NDEBUG) tcp_debx = 0; td->td_time = iptime(); @@ -106,18 +112,54 @@ tcp_trace(act, ostate, tp, ipgen, th, req) td->td_cb = *tp; else bzero((caddr_t)&td->td_cb, sizeof (*tp)); - if (ipgen) - bcopy((caddr_t)ipgen, td->td_ipgen, + if (ipgen) { + switch (td->td_family) { + case AF_INET: + bcopy((caddr_t)ipgen, (caddr_t)&td->td_ti.ti_i, + sizeof(td->td_ti.ti_i)); + bzero((caddr_t)td->td_ip6buf, sizeof(td->td_ip6buf)); + break; #ifdef INET6 - isipv6 ? sizeof(struct ip6_hdr) : + case AF_INET6: + bcopy((caddr_t)ipgen, (caddr_t)td->td_ip6buf, + sizeof(td->td_ip6buf)); + bzero((caddr_t)&td->td_ti.ti_i, + sizeof(td->td_ti.ti_i)); + break; #endif - sizeof(struct ip)); - else - bzero((caddr_t)td->td_ipgen, sizeof (td->td_ipgen)); - if (th) - td->td_th = *th; - else - bzero((caddr_t)&td->td_th, sizeof (td->td_th)); + default: + bzero((caddr_t)td->td_ip6buf, sizeof(td->td_ip6buf)); + bzero((caddr_t)&td->td_ti.ti_i, + sizeof(td->td_ti.ti_i)); + break; + } + } else { + bzero((caddr_t)&td->td_ti.ti_i, sizeof(td->td_ti.ti_i)); + bzero((caddr_t)td->td_ip6buf, sizeof(td->td_ip6buf)); + } + if (th) { + switch (td->td_family) { + case AF_INET: + td->td_ti.ti_t = *th; + bzero((caddr_t)&td->td_ti6.th, sizeof(td->td_ti6.th)); + break; +#ifdef INET6 + case AF_INET6: + td->td_ti6.th = *th; + bzero((caddr_t)&td->td_ti.ti_t, + sizeof(td->td_ti.ti_t)); + break; +#endif + default: + bzero((caddr_t)&td->td_ti.ti_t, + sizeof(td->td_ti.ti_t)); + bzero((caddr_t)&td->td_ti6.th, sizeof(td->td_ti6.th)); + break; + } + } else { + bzero((caddr_t)&td->td_ti.ti_t, sizeof(td->td_ti.ti_t)); + bzero((caddr_t)&td->td_ti6.th, sizeof(td->td_ti6.th)); + } td->td_req = req; #ifdef TCPDEBUG if (tcpconsdebug == 0) diff --git a/sys/netinet/tcp_debug.h b/sys/netinet/tcp_debug.h index 98275392844b..773d3e4bb250 100644 --- a/sys/netinet/tcp_debug.h +++ b/sys/netinet/tcp_debug.h @@ -42,8 +42,21 @@ struct tcp_debug { short td_act; short td_ostate; caddr_t td_tcb; - u_char td_ipgen[40]; /* the size must be of max ip header, now IPv6 */ - struct tcphdr td_th; + int td_family; + /* + * Co-existense of td_ti and td_ti6 below is ugly, but it is necessary + * to achieve backword compatibility to some extent. + */ + struct tcpiphdr td_ti; + struct { +#if !defined(_KERNEL) && defined(INET6) + struct ip6_hdr ip6; +#else + u_char ip6buf[40]; /* sizeof(struct ip6_hdr) */ +#endif + struct tcphdr th; + } td_ti6; +#define td_ip6buf td_ti6.ip6buf short td_req; struct tcpcb td_cb; }; diff --git a/usr.sbin/trpt/trpt.c b/usr.sbin/trpt/trpt.c index 66e51d84e9bc..9258af76df64 100644 --- a/usr.sbin/trpt/trpt.c +++ b/usr.sbin/trpt/trpt.c @@ -100,7 +100,7 @@ void dotrace __P((caddr_t)); void klseek __P((int, off_t, int)); int numeric __P((caddr_t *, caddr_t *)); void tcp_trace __P((short, short, struct tcpcb *, struct tcpcb *, - void *, struct tcphdr *, int)); + int, void *, struct tcphdr *, int)); static void usage __P((void)); int @@ -227,7 +227,7 @@ dotrace(tcpcb) { register struct tcp_debug *td; register int i; - int prev_debx = tcp_debx; + int prev_debx = tcp_debx, family; again: if (--tcp_debx < 0) tcp_debx = TCP_NDEBUG - 1; @@ -236,8 +236,27 @@ again: if (--tcp_debx < 0) if (tcpcb && td->td_tcb != tcpcb) continue; ntime = ntohl(td->td_time); - tcp_trace(td->td_act, td->td_ostate, td->td_tcb, &td->td_cb, - td->td_ipgen, &td->td_th, td->td_req); +#ifdef INET6 + family = td->td_family; +#else + family = AF_INET; +#endif + switch(family) { + case AF_INET: + tcp_trace(td->td_act, td->td_ostate, + (struct tcpcb *)td->td_tcb, + &td->td_cb, td->td_family, &td->td_ti.ti_i, + &td->td_ti.ti_t, td->td_req); + break; +#ifdef INET6 + case AF_INET6: + tcp_trace(td->td_act, td->td_ostate, + (struct tcpcb *)td->td_tcb, + &td->td_cb, td->td_family, &td->td_ti6.ip6, + &td->td_ti6.th, td->td_req); + break; +#endif + } if (i == tcp_debx) goto done; } @@ -246,8 +265,27 @@ again: if (--tcp_debx < 0) if (tcpcb && td->td_tcb != tcpcb) continue; ntime = ntohl(td->td_time); - tcp_trace(td->td_act, td->td_ostate, td->td_tcb, &td->td_cb, - td->td_ipgen, &td->td_th, td->td_req); +#ifdef INET6 + family = td->td_family; +#else + family = AF_INET; +#endif + switch(family) { + case AF_INET: + tcp_trace(td->td_act, td->td_ostate, + (struct tcpcb *)td->td_tcb, + &td->td_cb, td->td_family, &td->td_ti.ti_i, + &td->td_ti.ti_t, td->td_req); + break; +#ifdef INET6 + case AF_INET6: + tcp_trace(td->td_act, td->td_ostate, + (struct tcpcb *)td->td_tcb, + &td->td_cb, td->td_family, &td->td_ti6.ip6, + &td->td_ti6.th, td->td_req); + break; +#endif + } } done: if (follow) { prev_debx = tcp_debx + 1; @@ -273,9 +311,10 @@ done: if (follow) { */ /*ARGSUSED*/ void -tcp_trace(act, ostate, atp, tp, ip, th, req) +tcp_trace(act, ostate, atp, tp, family, ip, th, req) short act, ostate; struct tcpcb *atp, *tp; + int family; void *ip; struct tcphdr *th; int req; @@ -290,12 +329,13 @@ tcp_trace(act, ostate, atp, tp, ip, th, req) #endif #ifdef INET6 - switch (((struct ip *)ip)->ip_v) { - case 4: + switch (family) { + case AF_INET: nopkt = 0; + isipv6 = 0; ip4 = (struct ip *)ip; break; - case 6: + case AF_INET6: nopkt = 0; isipv6 = 1; ip6 = (struct ip6_hdr *)ip;