xref: /csrg-svn/usr.sbin/trsp/trsp.c (revision 42829)
125117Ssklower /*
225117Ssklower  * Copyright (c) 1985 Regents of the University of California.
334940Sbostic  * All rights reserved.
434940Sbostic  *
5*42829Sbostic  * %sccs.include.redist.c%
625117Ssklower  */
725117Ssklower 
825117Ssklower #ifndef lint
925117Ssklower char copyright[] =
1034940Sbostic "@(#) Copyright (c) 1985 Regents of the University of California.\n\
1125117Ssklower  All rights reserved.\n";
1234940Sbostic #endif /* not lint */
1325117Ssklower 
1425117Ssklower #ifndef lint
15*42829Sbostic static char sccsid[] = "@(#)trsp.c	6.7 (Berkeley) 06/01/90";
1634940Sbostic #endif /* not lint */
1725117Ssklower 
1825117Ssklower #include <sys/param.h>
1925117Ssklower #include <sys/socket.h>
2025117Ssklower #include <sys/socketvar.h>
2125117Ssklower #define PRUREQUESTS
2225117Ssklower #include <sys/protosw.h>
2325117Ssklower 
2425117Ssklower #include <net/route.h>
2525117Ssklower #include <net/if.h>
2625117Ssklower 
2725117Ssklower #define TCPSTATES
2825117Ssklower #include <netinet/tcp_fsm.h>
2925117Ssklower #define	TCPTIMERS
3025117Ssklower #include <netinet/tcp_timer.h>
3125117Ssklower 
3225117Ssklower #include <netns/ns.h>
3325117Ssklower #include <netns/ns_pcb.h>
3425117Ssklower #include <netns/idp.h>
3525117Ssklower #include <netns/idp_var.h>
3625117Ssklower #include <netns/sp.h>
3725117Ssklower #include <netns/spidp.h>
3835616Sbostic #include <netns/spp_timer.h>
3925117Ssklower #include <netns/spp_var.h>
4025117Ssklower #define SANAMES
4125117Ssklower #include <netns/spp_debug.h>
4225117Ssklower 
4325117Ssklower #include <stdio.h>
4425117Ssklower #include <errno.h>
4525117Ssklower #include <nlist.h>
4637985Sbostic #include <paths.h>
4725117Ssklower 
4825117Ssklower unsigned long	ntime;
4925117Ssklower int	sflag;
5025117Ssklower int	tflag;
5125117Ssklower int	jflag;
5225117Ssklower int	aflag;
5325117Ssklower int	zflag;
5425117Ssklower int	numeric();
5525117Ssklower struct	nlist nl[] = {
5625117Ssklower 	{ "_spp_debug" },
5725117Ssklower 	{ "_spp_debx" },
5825117Ssklower 	0
5925117Ssklower };
6025117Ssklower struct	spp_debug spp_debug[SPP_NDEBUG];
6125117Ssklower caddr_t	spp_pcbs[SPP_NDEBUG];
6225117Ssklower int	spp_debx;
6325117Ssklower 
6425117Ssklower main(argc, argv)
6525117Ssklower 	int argc;
6625117Ssklower 	char **argv;
6725117Ssklower {
6825117Ssklower 	int i, mask = 0, npcbs = 0;
6937309Sbostic 	char *system, *core;
7025117Ssklower 
7137309Sbostic 	system = _PATH_UNIX;
7237309Sbostic 	core = _PATH_KMEM;
7337309Sbostic 
7425117Ssklower 	argc--, argv++;
7525117Ssklower again:
7625117Ssklower 	if (argc > 0 && !strcmp(*argv, "-a")) {
7725117Ssklower 		aflag++, argc--, argv++;
7825117Ssklower 		goto again;
7925117Ssklower 	}
8025117Ssklower 	if (argc > 0 && !strcmp(*argv, "-z")) {
8125117Ssklower 		zflag++, argc--, argv++;
8225117Ssklower 		goto again;
8325117Ssklower 	}
8425117Ssklower 	if (argc > 0 && !strcmp(*argv, "-s")) {
8525117Ssklower 		sflag++, argc--, argv++;
8625117Ssklower 		goto again;
8725117Ssklower 	}
8825117Ssklower 	if (argc > 0 && !strcmp(*argv, "-t")) {
8925117Ssklower 		tflag++, argc--, argv++;
9025117Ssklower 		goto again;
9125117Ssklower 	}
9225117Ssklower 	if (argc > 0 && !strcmp(*argv, "-j")) {
9325117Ssklower 		jflag++, argc--, argv++;
9425117Ssklower 		goto again;
9525117Ssklower 	}
9625117Ssklower 	if (argc > 0 && !strcmp(*argv, "-p")) {
9725117Ssklower 		argc--, argv++;
9825117Ssklower 		if (argc < 1) {
9925117Ssklower 			fprintf(stderr, "-p: missing sppcb address\n");
10025117Ssklower 			exit(1);
10125117Ssklower 		}
10225117Ssklower 		if (npcbs >= SPP_NDEBUG) {
10325117Ssklower 			fprintf(stderr, "-p: too many pcb's specified\n");
10425117Ssklower 			exit(1);
10525117Ssklower 		}
10625117Ssklower 		sscanf(*argv, "%x", &spp_pcbs[npcbs++]);
10725117Ssklower 		argc--, argv++;
10825117Ssklower 		goto again;
10925117Ssklower 	}
11025117Ssklower 	if (argc > 0) {
11125117Ssklower 		system = *argv;
11225117Ssklower 		argc--, argv++;
11325117Ssklower 		mask++;
11425117Ssklower 	}
11525117Ssklower 	if (argc > 0) {
11625117Ssklower 		core = *argv;
11725117Ssklower 		argc--, argv++;
11825117Ssklower 		mask++;
11925117Ssklower 	}
12025117Ssklower 	(void) nlist(system, nl);
12125117Ssklower 	if (nl[0].n_value == 0) {
12225117Ssklower 		fprintf(stderr, "trsp: %s: no namelist\n", system);
12325117Ssklower 		exit(1);
12425117Ssklower 	}
12525117Ssklower 	(void) close(0);
12625117Ssklower 	if (open(core, 0) < 0) {
12725117Ssklower 		fprintf(stderr, "trsp: "); perror(core);
12825117Ssklower 		exit(2);
12925117Ssklower 	}
13025117Ssklower 	if (mask) {
13125117Ssklower 		nl[0].n_value &= 0x7fffffff;
13225117Ssklower 		nl[1].n_value &= 0x7fffffff;
13325117Ssklower 	}
13425117Ssklower 	(void) lseek(0, nl[1].n_value, 0);
13525117Ssklower 	if (read(0, &spp_debx, sizeof (spp_debx)) != sizeof (spp_debx)) {
13625117Ssklower 		fprintf(stderr, "trsp: "); perror("spp_debx");
13725117Ssklower 		exit(3);
13825117Ssklower 	}
13925117Ssklower 	printf("spp_debx=%d\n", spp_debx);
14025117Ssklower 	(void) lseek(0, nl[0].n_value, 0);
14125117Ssklower 	if (read(0, spp_debug, sizeof (spp_debug)) != sizeof (spp_debug)) {
14225117Ssklower 		fprintf(stderr, "trsp: "); perror("spp_debug");
14325117Ssklower 		exit(3);
14425117Ssklower 	}
14525117Ssklower 	/*
14625117Ssklower 	 * Here, we just want to clear out the old trace data and start over.
14725117Ssklower 	 */
14825117Ssklower 	if (zflag) {
14925117Ssklower 		char *cp = (char *) spp_debug,
15025117Ssklower 		     *cplim = cp + sizeof(spp_debug);
15125117Ssklower 		(void) close(0);
15225117Ssklower 		if (open(core, 2) < 0) {
15325117Ssklower 			fprintf(stderr, "trsp: "); perror(core);
15425117Ssklower 			exit(2);
15525117Ssklower 		}
15625117Ssklower 		while(cp < cplim) *cp++ = 0;
15725117Ssklower 		(void) lseek(0, nl[0].n_value, 0);
15825117Ssklower 		if (write(0, spp_debug, sizeof (spp_debug)) != sizeof (spp_debug)) {
15925117Ssklower 			fprintf(stderr, "trsp: "); perror("spp_debug");
16025117Ssklower 			exit(3);
16125117Ssklower 		}
16225117Ssklower 		(void) lseek(0, nl[1].n_value, 0);
16325117Ssklower 		spp_debx = 0;
16425117Ssklower 		if (write(0, &spp_debx, sizeof (spp_debx)) != sizeof (spp_debx)) {
16525117Ssklower 			fprintf(stderr, "trsp: "); perror("spp_debx");
16625117Ssklower 			exit(3);
16725117Ssklower 		}
16825117Ssklower 		exit(0);
16925117Ssklower 	}
17025117Ssklower 	/*
17125117Ssklower 	 * If no control blocks have been specified, figure
17225117Ssklower 	 * out how many distinct one we have and summarize
17325117Ssklower 	 * them in spp_pcbs for sorting the trace records
17425117Ssklower 	 * below.
17525117Ssklower 	 */
17625117Ssklower 	if (npcbs == 0) {
17725117Ssklower 		for (i = 0; i < SPP_NDEBUG; i++) {
17825117Ssklower 			register int j;
17925117Ssklower 			register struct spp_debug *sd = &spp_debug[i];
18025117Ssklower 
18125117Ssklower 			if (sd->sd_cb == 0)
18225117Ssklower 				continue;
18325117Ssklower 			for (j = 0; j < npcbs; j++)
18425117Ssklower 				if (spp_pcbs[j] == sd->sd_cb)
18525117Ssklower 					break;
18625117Ssklower 			if (j >= npcbs)
18725117Ssklower 				spp_pcbs[npcbs++] = sd->sd_cb;
18825117Ssklower 		}
18925117Ssklower 	}
19025117Ssklower 	qsort(spp_pcbs, npcbs, sizeof (caddr_t), numeric);
19125117Ssklower 	if (jflag) {
19225117Ssklower 		char *cp = "";
19325117Ssklower 
19425117Ssklower 		for (i = 0; i < npcbs; i++) {
19525117Ssklower 			printf("%s%x", cp, spp_pcbs[i]);
19625117Ssklower 			cp = ", ";
19725117Ssklower 		}
19825117Ssklower 		if (*cp)
19925117Ssklower 			putchar('\n');
20025117Ssklower 		exit(0);
20125117Ssklower 	}
20225117Ssklower 	for (i = 0; i < npcbs; i++) {
20325117Ssklower 		printf("\n%x:\n", spp_pcbs[i]);
20425117Ssklower 		dotrace(spp_pcbs[i]);
20525117Ssklower 	}
20625117Ssklower 	exit(0);
20725117Ssklower }
20825117Ssklower 
20925117Ssklower dotrace(sppcb)
21025117Ssklower 	register caddr_t sppcb;
21125117Ssklower {
21225117Ssklower 	register int i;
21325117Ssklower 	register struct spp_debug *sd;
21425117Ssklower 
21525117Ssklower 	for (i = spp_debx % SPP_NDEBUG; i < SPP_NDEBUG; i++) {
21625117Ssklower 		sd = &spp_debug[i];
21725117Ssklower 		if (sppcb && sd->sd_cb != sppcb)
21825117Ssklower 			continue;
21925117Ssklower 		ntime = ntohl(sd->sd_time);
22025117Ssklower 		spp_trace(sd->sd_act, sd->sd_ostate, sd->sd_cb, &sd->sd_sp,
22125117Ssklower 		    &sd->sd_si, sd->sd_req);
22225117Ssklower 	}
22325117Ssklower 	for (i = 0; i < spp_debx % SPP_NDEBUG; i++) {
22425117Ssklower 		sd = &spp_debug[i];
22525117Ssklower 		if (sppcb && sd->sd_cb != sppcb)
22625117Ssklower 			continue;
22725117Ssklower 		ntime = ntohl(sd->sd_time);
22825117Ssklower 		spp_trace(sd->sd_act, sd->sd_ostate, sd->sd_cb, &sd->sd_sp,
22925117Ssklower 		    &sd->sd_si, sd->sd_req);
23025117Ssklower 	}
23125117Ssklower }
23225117Ssklower 
23325117Ssklower ptime(ms)
23425117Ssklower 	int ms;
23525117Ssklower {
23625117Ssklower 
23725117Ssklower 	printf("%03d ", (ms/10) % 1000);
23825117Ssklower }
23925117Ssklower 
24025117Ssklower numeric(c1, c2)
24125117Ssklower 	caddr_t *c1, *c2;
24225117Ssklower {
24325117Ssklower 
24425117Ssklower 	return (*c1 - *c2);
24525117Ssklower }
24625117Ssklower 
24725117Ssklower spp_trace(act, ostate, asp, sp, si, req)
24825117Ssklower 	short act, ostate;
24925117Ssklower 	struct sppcb *asp, *sp;
25025117Ssklower 	struct spidp *si;
25125117Ssklower 	int req;
25225117Ssklower {
25325117Ssklower 	u_short seq, ack, len, alo;
25425117Ssklower 	int flags, timer;
25525117Ssklower 	char *cp;
25625117Ssklower 
25725117Ssklower 	if(ostate >= TCP_NSTATES) ostate = 0;
25825117Ssklower 	if(act > SA_DROP) act = SA_DROP;
25925117Ssklower 	printf("\n");
26025117Ssklower 	ptime(ntime);
26125117Ssklower 	printf("%s:%s", tcpstates[ostate], sanames[act]);
26225117Ssklower 
26325117Ssklower 	if (si != 0) {
26425117Ssklower 		seq = si->si_seq;
26525117Ssklower 		ack = si->si_ack;
26625117Ssklower 		alo = si->si_alo;
26725117Ssklower 		len = si->si_len;
26825117Ssklower 		switch (act) {
26925117Ssklower 		case SA_RESPOND:
27025117Ssklower 		case SA_OUTPUT:
27125117Ssklower 				seq = ntohs(seq);
27225117Ssklower 				ack = ntohs(ack);
27325117Ssklower 				alo = ntohs(alo);
27425117Ssklower 				len = ntohs(len);
27525117Ssklower 		case SA_INPUT:
27625117Ssklower 		case SA_DROP:
27725117Ssklower 			if (aflag) {
27825117Ssklower 				printf("\n\tsna=");
27925117Ssklower 				ns_printhost(&si->si_sna);
28025117Ssklower 				printf("\tdna=");
28125117Ssklower 				ns_printhost(&si->si_dna);
28225117Ssklower 			}
28325117Ssklower 			printf("\n\t");
28425117Ssklower #define p1(f)  { printf("%s = %x, ", "f", f); }
28525117Ssklower 			p1(seq); p1(ack); p1(alo); p1(len);
28625117Ssklower 			flags = si->si_cc;
28725117Ssklower 			printf("flags=%x", flags);
28825117Ssklower 			if (flags) {
28925117Ssklower 				char *cp = "<";
29040280Sbostic #define pf(f) { if (flags&f) { printf("%s%s", cp, "f"); cp = ","; } }
29140280Sbostic 				pf(SP_SP); pf(SP_SA); pf(SP_OB); pf(SP_EM);
29225117Ssklower 				printf(">");
29325117Ssklower 			}
29425117Ssklower 			printf(", ");
29525117Ssklower #define p2(f)  { printf("%s = %x, ", "f", si->si_/**/f); }
29625117Ssklower 			p2(sid);p2(did);p2(dt);
29725117Ssklower 			printf("\n\tsna=");
29825117Ssklower 			ns_printhost(&si->si_sna);
29925117Ssklower 			printf("\tdna=");
30025117Ssklower 			ns_printhost(&si->si_dna);
30125117Ssklower 		}
30225117Ssklower 	}
30325117Ssklower 	if(act == SA_USER) {
30425117Ssklower 		printf("\treq=%s", prurequests[req&0xff]);
30525117Ssklower 		if ((req & 0xff) == PRU_SLOWTIMO)
30625117Ssklower 			printf("<%s>", tcptimers[req>>8]);
30725117Ssklower 	}
30825117Ssklower 	printf(" -> %s", tcpstates[sp->s_state]);
30925117Ssklower 
31025117Ssklower 	/* print out internal state of sp !?! */
31125117Ssklower 	printf("\n");
31225117Ssklower 	if (sp == 0)
31325117Ssklower 		return;
31425117Ssklower #define p3(f)  { printf("%s = %x, ", "f", sp->s_/**/f); }
31525117Ssklower 	if(sflag) {
31635616Sbostic 		printf("\t"); p3(rack); p3(ralo); p3(smax); p3(snxt); p3(flags);
31725117Ssklower #undef pf
31825117Ssklower #define pf(f) { if (flags&SF_/**/f) { printf("%s%s", cp, "f"); cp = ","; } }
31925117Ssklower 		flags = sp->s_flags;
32025117Ssklower 		if (flags || sp->s_oobflags) {
32125117Ssklower 			char *cp = "<";
32235616Sbostic 			pf(ACKNOW); pf(DELACK); pf(HI); pf(HO);
32335616Sbostic 			pf(PI); pf(WIN); pf(RXT); pf(RVD);
32425117Ssklower 			flags = sp->s_oobflags;
32525117Ssklower 			pf(SOOB); pf(IOOB);
32625117Ssklower 			printf(">");
32725117Ssklower 		}
32825117Ssklower 
32925117Ssklower 	}
33025117Ssklower 	/* print out timers? */
33125117Ssklower 	if (tflag) {
33225117Ssklower 		char *cp = "\t";
33325117Ssklower 		register int i;
33425117Ssklower 
33525117Ssklower 		printf("\n\tTIMERS: ");
33625117Ssklower 		p3(idle); p3(force); p3(rtseq);
33725117Ssklower 		for (i = 0; i < TCPT_NTIMERS; i++) {
33825117Ssklower 			if (sp->s_timer[i] == 0)
33925117Ssklower 				continue;
34025117Ssklower 			printf("%s%s=%d", cp, tcptimers[i], sp->s_timer[i]);
34125117Ssklower 			if (i == TCPT_REXMT)
34225117Ssklower 				printf(" (s_rxtshft=%d)", sp->s_rxtshift);
34325117Ssklower 			cp = ", ";
34425117Ssklower 		}
34525117Ssklower 		if (*cp != '\t')
34625117Ssklower 			putchar('\n');
34725117Ssklower 	}
34825117Ssklower }
34925117Ssklower 
35025117Ssklower ns_printhost(p)
35125117Ssklower register struct ns_addr *p;
35225117Ssklower {
35325117Ssklower 
35425117Ssklower 	printf("<net:%x%x,host:%4.4x%4.4x%4.4x,port:%x>",
35525117Ssklower 			p->x_net.s_net[0],
35625117Ssklower 			p->x_net.s_net[1],
35725117Ssklower 			p->x_host.s_host[0],
35825117Ssklower 			p->x_host.s_host[1],
35925117Ssklower 			p->x_host.s_host[2],
36025117Ssklower 			p->x_port);
36125117Ssklower 
36225117Ssklower }
36325117Ssklower 
364