xref: /csrg-svn/usr.sbin/trpt/trpt.c (revision 8382)
16463Swnj #ifndef lint
2*8382Ssam static char sccsid[] = "@(#)trpt.c	4.2 82/10/07";
36463Swnj #endif
46463Swnj 
56463Swnj #include <sys/param.h>
66463Swnj #include <sys/socket.h>
76463Swnj #include <sys/socketvar.h>
86463Swnj #define PRUREQUESTS
96463Swnj #include <sys/protosw.h>
106463Swnj #include <net/in.h>
116463Swnj #include <net/route.h>
126463Swnj #include <net/in_pcb.h>
136463Swnj #include <net/in_systm.h>
146463Swnj #include <net/if.h>
156463Swnj #include <net/ip.h>
166463Swnj #include <net/ip_var.h>
176463Swnj #include <net/tcp.h>
186463Swnj #define TCPSTATES
196463Swnj #include <net/tcp_fsm.h>
206463Swnj #include <net/tcp_seq.h>
216463Swnj #define	TCPTIMERS
226463Swnj #include <net/tcp_timer.h>
236463Swnj #include <net/tcp_var.h>
246463Swnj #include <net/tcpip.h>
256463Swnj #define	TANAMES
266463Swnj #include <net/tcp_debug.h>
276463Swnj #include <errno.h>
286463Swnj 
296463Swnj #include <nlist.h>
306463Swnj 
316463Swnj n_time	ntime;
326463Swnj int	sflag;
336463Swnj struct	nlist nl[] = {
346463Swnj 	{ "_tcp_debug" },
356463Swnj 	{ "_tcp_debx" },
366463Swnj 	0
376463Swnj };
386463Swnj struct	tcp_debug tcp_debug[TCP_NDEBUG];
396463Swnj int	tcp_debx;
406463Swnj 
416463Swnj main(argc, argv)
426463Swnj 	int argc;
436463Swnj 	char **argv;
446463Swnj {
456463Swnj 	int i;
466463Swnj 
476463Swnj 	argc--, argv++;
486463Swnj again:
496463Swnj 	if (argc > 0 && !strcmp(*argv, "-s")) {
506463Swnj 		sflag++, argc--, argv++;
516463Swnj 		goto again;
526463Swnj 	}
536463Swnj 	nlist(argc > 0 ? *argv : "/vmunix", nl);
546463Swnj 	if (nl[0].n_value == 0) {
556463Swnj 		printf("no namelist\n");
566463Swnj 		exit(1);
576463Swnj 	}
586463Swnj 	close(0);
596463Swnj 	open(argc > 1 ? argv[1] : "/dev/kmem", 0);
606463Swnj 	if (argc > 1) {
616463Swnj 		nl[0].n_value &= 0x7fffffff;
626463Swnj 		nl[1].n_value &= 0x7fffffff;
636463Swnj 	}
646463Swnj 	lseek(0, nl[1].n_value, 0);
656463Swnj 	read(0, &tcp_debx, sizeof (tcp_debx));
666463Swnj 	printf("tcp_debx=%d\n", tcp_debx);
676463Swnj 	lseek(0, nl[0].n_value, 0);
686463Swnj 	read(0, tcp_debug, sizeof (tcp_debug));
696463Swnj 	for (i = tcp_debx % TCP_NDEBUG; i < TCP_NDEBUG; i++) {
706463Swnj 		struct tcp_debug *td = &tcp_debug[i];
71*8382Ssam 
72*8382Ssam 		ntime = ntohl(td->td_time);
736463Swnj 		tcp_trace(td->td_act, td->td_ostate, td->td_tcb, &td->td_cb,
746463Swnj 		    &td->td_ti, td->td_req);
756463Swnj 	}
766463Swnj 	for (i = 0; i < tcp_debx % TCP_NDEBUG; i++) {
776463Swnj 		struct tcp_debug *td = &tcp_debug[i];
78*8382Ssam 
79*8382Ssam 		ntime = ntohl(td->td_time);
806463Swnj 		tcp_trace(td->td_act, td->td_ostate, td->td_tcb, &td->td_cb,
816463Swnj 		    &td->td_ti, td->td_req);
826463Swnj 	}
836463Swnj 	exit(0);
846463Swnj }
856463Swnj 
866463Swnj /*
876463Swnj  * Tcp debug routines
886463Swnj  */
896463Swnj tcp_trace(act, ostate, atp, tp, ti, req)
906463Swnj 	short act, ostate;
916463Swnj 	struct tcpcb *atp, *tp;
926463Swnj 	struct tcpiphdr *ti;
936463Swnj 	int req;
946463Swnj {
956463Swnj 	tcp_seq seq, ack;
96*8382Ssam 	int len, flags, win, timer;
976463Swnj 	char *cp;
986463Swnj 
996463Swnj 	ptime(ntime);
1006463Swnj 	printf("%x %s:%s ", ((int)atp)&0xfffff,
1016463Swnj 	    tcpstates[ostate], tanames[act]);
1026463Swnj 	switch (act) {
1036463Swnj 
1046463Swnj 	case TA_INPUT:
1056463Swnj 	case TA_OUTPUT:
1066463Swnj 		seq = ti->ti_seq;
1076463Swnj 		ack = ti->ti_ack;
1086463Swnj 		len = ti->ti_len;
1096463Swnj 		win = ti->ti_win;
110*8382Ssam #if vax || pdp11
1116463Swnj 		if (act == TA_OUTPUT) {
1126463Swnj 			seq = ntohl(seq);
1136463Swnj 			ack = ntohl(ack);
1146463Swnj 			len = ntohs(len);
1156463Swnj 			win = ntohs(win);
1166463Swnj 		}
1176463Swnj #endif
1186463Swnj 		if (act == TA_OUTPUT)
1196463Swnj 			len -= sizeof (struct tcphdr);
1206463Swnj 		if (len)
1216463Swnj 			printf("[%x..%x)", seq, seq+len);
1226463Swnj 		else
1236463Swnj 			printf("%x", seq);
1246463Swnj 		printf("@%x", ack);
1256463Swnj 		if (win)
1266463Swnj 			printf("(win=%d)", win);
1276463Swnj 		flags = ti->ti_flags;
1286463Swnj 		if (flags) {
1296463Swnj 			char *cp = "<";
1306463Swnj #define pf(f) { if (ti->ti_flags&TH_/**/f) { printf("%s%s", cp, "f"); cp = ","; } }
1316463Swnj 			pf(SYN); pf(ACK); pf(FIN); pf(RST); pf(URG);
1326463Swnj 			printf(">");
1336463Swnj 		}
1346463Swnj 		break;
1356463Swnj 
1366463Swnj 	case TA_USER:
137*8382Ssam 		timer = req >> 8;
138*8382Ssam 		req &= 0xff;
139*8382Ssam 		printf("%s", prurequests[req]);
140*8382Ssam 		if (req == PRU_SLOWTIMO || req == PRU_FASTTIMO)
141*8382Ssam 			printf("<%s>", tcptimers[timer]);
1426463Swnj 		break;
1436463Swnj 	}
1446463Swnj 	printf(" -> %s", tcpstates[tp->t_state]);
1456463Swnj 	/* print out internal state of tp !?! */
1466463Swnj 	printf("\n");
1476463Swnj 	if (sflag) {
1486463Swnj 		printf("\trcv_nxt %x rcv_wnd %d snd_una %x snd_nxt %x snd_max %x\n",
1496463Swnj 		    tp->rcv_nxt, tp->rcv_wnd, tp->snd_una, tp->snd_nxt, tp->snd_max);
1506463Swnj 		printf("\tsnd_wl1 %x snd_wl2 %x snd_wnd %x\n", tp->snd_wl1, tp->snd_wl2, tp->snd_wnd);
1516463Swnj 	}
1526463Swnj }
1536463Swnj 
1546463Swnj ptime(ms)
1556463Swnj 	int ms;
1566463Swnj {
1576463Swnj 
1586463Swnj 	printf("%03d ", (ms/10) % 1000);
1596463Swnj }
160