xref: /csrg-svn/usr.sbin/trpt/trpt.c (revision 6463)
1*6463Swnj #ifndef lint
2*6463Swnj static char sccsid[] = "@(#)trpt.c	4.1 82/04/02";
3*6463Swnj #endif
4*6463Swnj 
5*6463Swnj #include <sys/param.h>
6*6463Swnj #include <sys/socket.h>
7*6463Swnj #include <sys/socketvar.h>
8*6463Swnj #define PRUREQUESTS
9*6463Swnj #include <sys/protosw.h>
10*6463Swnj #include <net/in.h>
11*6463Swnj #include <net/route.h>
12*6463Swnj #include <net/in_pcb.h>
13*6463Swnj #include <net/in_systm.h>
14*6463Swnj #include <net/if.h>
15*6463Swnj #include <net/ip.h>
16*6463Swnj #include <net/ip_var.h>
17*6463Swnj #include <net/tcp.h>
18*6463Swnj #define TCPSTATES
19*6463Swnj #include <net/tcp_fsm.h>
20*6463Swnj #include <net/tcp_seq.h>
21*6463Swnj #define	TCPTIMERS
22*6463Swnj #include <net/tcp_timer.h>
23*6463Swnj #include <net/tcp_var.h>
24*6463Swnj #include <net/tcpip.h>
25*6463Swnj #define	TANAMES
26*6463Swnj #include <net/tcp_debug.h>
27*6463Swnj #include <errno.h>
28*6463Swnj 
29*6463Swnj #include <nlist.h>
30*6463Swnj 
31*6463Swnj n_time	ntime;
32*6463Swnj int	sflag;
33*6463Swnj struct	nlist nl[] = {
34*6463Swnj 	{ "_tcp_debug" },
35*6463Swnj 	{ "_tcp_debx" },
36*6463Swnj 	0
37*6463Swnj };
38*6463Swnj struct	tcp_debug tcp_debug[TCP_NDEBUG];
39*6463Swnj int	tcp_debx;
40*6463Swnj 
41*6463Swnj main(argc, argv)
42*6463Swnj 	int argc;
43*6463Swnj 	char **argv;
44*6463Swnj {
45*6463Swnj 	int i;
46*6463Swnj 
47*6463Swnj 	argc--, argv++;
48*6463Swnj again:
49*6463Swnj 	if (argc > 0 && !strcmp(*argv, "-s")) {
50*6463Swnj 		sflag++, argc--, argv++;
51*6463Swnj 		goto again;
52*6463Swnj 	}
53*6463Swnj 	nlist(argc > 0 ? *argv : "/vmunix", nl);
54*6463Swnj 	if (nl[0].n_value == 0) {
55*6463Swnj 		printf("no namelist\n");
56*6463Swnj 		exit(1);
57*6463Swnj 	}
58*6463Swnj 	close(0);
59*6463Swnj 	open(argc > 1 ? argv[1] : "/dev/kmem", 0);
60*6463Swnj 	if (argc > 1) {
61*6463Swnj 		nl[0].n_value &= 0x7fffffff;
62*6463Swnj 		nl[1].n_value &= 0x7fffffff;
63*6463Swnj 	}
64*6463Swnj 	lseek(0, nl[1].n_value, 0);
65*6463Swnj 	read(0, &tcp_debx, sizeof (tcp_debx));
66*6463Swnj 	printf("tcp_debx=%d\n", tcp_debx);
67*6463Swnj 	lseek(0, nl[0].n_value, 0);
68*6463Swnj 	read(0, tcp_debug, sizeof (tcp_debug));
69*6463Swnj 	for (i = tcp_debx % TCP_NDEBUG; i < TCP_NDEBUG; i++) {
70*6463Swnj 		struct tcp_debug *td = &tcp_debug[i];
71*6463Swnj 		ntime = td->td_time;
72*6463Swnj #if vax
73*6463Swnj 		ntime = ntohl(ntime);
74*6463Swnj #endif
75*6463Swnj 		tcp_trace(td->td_act, td->td_ostate, td->td_tcb, &td->td_cb,
76*6463Swnj 		    &td->td_ti, td->td_req);
77*6463Swnj 	}
78*6463Swnj 	for (i = 0; i < tcp_debx % TCP_NDEBUG; i++) {
79*6463Swnj 		struct tcp_debug *td = &tcp_debug[i];
80*6463Swnj 		ntime = td->td_time;
81*6463Swnj #if vax
82*6463Swnj 		ntime = ntohl(ntime);
83*6463Swnj #endif
84*6463Swnj 		tcp_trace(td->td_act, td->td_ostate, td->td_tcb, &td->td_cb,
85*6463Swnj 		    &td->td_ti, td->td_req);
86*6463Swnj 	}
87*6463Swnj 	exit(0);
88*6463Swnj }
89*6463Swnj 
90*6463Swnj /*
91*6463Swnj  * Tcp debug routines
92*6463Swnj  */
93*6463Swnj tcp_trace(act, ostate, atp, tp, ti, req)
94*6463Swnj 	short act, ostate;
95*6463Swnj 	struct tcpcb *atp, *tp;
96*6463Swnj 	struct tcpiphdr *ti;
97*6463Swnj 	int req;
98*6463Swnj {
99*6463Swnj 	tcp_seq seq, ack;
100*6463Swnj 	int len, flags, win;
101*6463Swnj 	char *cp;
102*6463Swnj 
103*6463Swnj 	ptime(ntime);
104*6463Swnj 	printf("%x %s:%s ", ((int)atp)&0xfffff,
105*6463Swnj 	    tcpstates[ostate], tanames[act]);
106*6463Swnj 	switch (act) {
107*6463Swnj 
108*6463Swnj 	case TA_INPUT:
109*6463Swnj 	case TA_OUTPUT:
110*6463Swnj 		seq = ti->ti_seq;
111*6463Swnj 		ack = ti->ti_ack;
112*6463Swnj 		len = ti->ti_len;
113*6463Swnj 		win = ti->ti_win;
114*6463Swnj #if vax
115*6463Swnj 		if (act == TA_OUTPUT) {
116*6463Swnj 			seq = ntohl(seq);
117*6463Swnj 			ack = ntohl(ack);
118*6463Swnj 			len = ntohs(len);
119*6463Swnj 			win = ntohs(win);
120*6463Swnj 		}
121*6463Swnj #endif
122*6463Swnj 		if (act == TA_OUTPUT)
123*6463Swnj 			len -= sizeof (struct tcphdr);
124*6463Swnj 		if (len)
125*6463Swnj 			printf("[%x..%x)", seq, seq+len);
126*6463Swnj 		else
127*6463Swnj 			printf("%x", seq);
128*6463Swnj 		printf("@%x", ack);
129*6463Swnj 		if (win)
130*6463Swnj 			printf("(win=%d)", win);
131*6463Swnj 		flags = ti->ti_flags;
132*6463Swnj 		if (flags) {
133*6463Swnj 			char *cp = "<";
134*6463Swnj #define pf(f) { if (ti->ti_flags&TH_/**/f) { printf("%s%s", cp, "f"); cp = ","; } }
135*6463Swnj 			pf(SYN); pf(ACK); pf(FIN); pf(RST); pf(URG);
136*6463Swnj 			printf(">");
137*6463Swnj 		}
138*6463Swnj 		break;
139*6463Swnj 
140*6463Swnj 	case TA_USER:
141*6463Swnj 		printf("%s", prurequests[req&0xff]);
142*6463Swnj 		if (req >> 8)
143*6463Swnj 			printf("<%s>", tcptimers[req>>8]);
144*6463Swnj 		break;
145*6463Swnj 	}
146*6463Swnj 	printf(" -> %s", tcpstates[tp->t_state]);
147*6463Swnj 	/* print out internal state of tp !?! */
148*6463Swnj 	printf("\n");
149*6463Swnj 	if (sflag) {
150*6463Swnj 		printf("\trcv_nxt %x rcv_wnd %d snd_una %x snd_nxt %x snd_max %x\n",
151*6463Swnj 		    tp->rcv_nxt, tp->rcv_wnd, tp->snd_una, tp->snd_nxt, tp->snd_max);
152*6463Swnj 		printf("\tsnd_wl1 %x snd_wl2 %x snd_wnd %x\n", tp->snd_wl1, tp->snd_wl2, tp->snd_wnd);
153*6463Swnj 	}
154*6463Swnj }
155*6463Swnj 
156*6463Swnj ptime(ms)
157*6463Swnj 	int ms;
158*6463Swnj {
159*6463Swnj 
160*6463Swnj 	printf("%03d ", (ms/10) % 1000);
161*6463Swnj }
162