Sorry in this just befor code freeze commit.

This is fix to usr.sbin/trpt and tcp_debug.[ch]
I think of putting this after 4.0 but,,,

 -There was bug that when INET6 is defined,
  IPv4 socket is not traced by trpt.

 -I received request from a person who distribute a program
  which use tcp_debug interface and print performance statistics,
  that
    -leave comptibility with old program as much as possible
    -use same interface with other OSes

  So, I talked with itojun, and synced API with netbsd IPv6 extension.

makeworld check, kernel build check(includes GENERIC) is done.

But if there happen to any problem, please let me know and
I soon backout this change.
This commit is contained in:
shin 2000-01-29 11:49:07 +00:00
parent a904c172cd
commit 6ef0117870
3 changed files with 117 additions and 22 deletions

View File

@ -53,6 +53,7 @@
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/protosw.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/in_systm.h>
@ -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)

View File

@ -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;
};

View File

@ -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;