xref: /csrg-svn/sys/tests/netiso/tpcb.c (revision 55606)
153364Ssklower /*-
253364Ssklower  * Copyright (c) 1988, 1990 The Regents of the University of California.
353364Ssklower  * All rights reserved.
453364Ssklower  *
553364Ssklower  * %sccs.include.redist.c%
653364Ssklower  */
753364Ssklower 
853364Ssklower #ifndef lint
953364Ssklower char copyright[] =
1053364Ssklower "@(#) Copyright (c) 1988, 1990 The Regents of the University of California.\n\
1153364Ssklower  All rights reserved.\n";
1253364Ssklower #endif /* not lint */
1353364Ssklower 
1453364Ssklower #ifndef lint
15*55606Ssklower static char sccsid[] = "@(#)tpcb.c	7.2 (Berkeley) 07/23/92";
1653364Ssklower #endif /* not lint */
1753364Ssklower 
1853364Ssklower #include <sys/param.h>
1953364Ssklower #include <sys/mbuf.h>
2053364Ssklower #include <sys/socket.h>
2153364Ssklower #include <sys/socketvar.h>
2253364Ssklower #include <sys/ioctl.h>
2353364Ssklower #include <net/route.h>
2453364Ssklower #include <net/if.h>
2553364Ssklower #define  TCPT_NTIMERS 4
2653364Ssklower #include <netiso/iso.h>
2753364Ssklower #include <netiso/tp_param.h>
2853364Ssklower #include <netiso/tp_user.h>
2953364Ssklower #include <netiso/tp_pcb.h>
3053364Ssklower #include <netiso/tp_events.h>
31*55606Ssklower #include <netiso/tp_states.h>
3253364Ssklower 
3353364Ssklower #include <errno.h>
3453364Ssklower #include <netdb.h>
3553364Ssklower #include <nlist.h>
3653364Ssklower #include <kvm.h>
3753364Ssklower #include <paths.h>
3853364Ssklower #include <stdio.h>
3953364Ssklower /*
4053364Ssklower  * This is a kernel debugging aid.
4153364Ssklower  * dumps out a tp_pcb.
4253364Ssklower  */
4353364Ssklower #define mem(e) (((struct tp_pcb *)0)->e)
4453364Ssklower #define Offsetof(e) ((int)&mem(e))
4553364Ssklower #define Sizeof(e) sizeof mem(e)
4653364Ssklower #if defined(__STDC__) || defined(__cplusplus)
4753364Ssklower #define Entry(n, e) { #n , Offsetof(e), Sizeof(e), }
4853364Ssklower #else
4953364Ssklower #define Entry(n, e) { "n" , Offsetof(e), Sizeof(e), }
5053364Ssklower #endif
5153364Ssklower struct tpcb_info {
5253364Ssklower 	char	*name;
5353364Ssklower 	int	offset;
5453364Ssklower 	int	size;
5553364Ssklower } tpcb_info[];
5653364Ssklower 
5753364Ssklower int tflag = 0;
5853364Ssklower int Iflag = 0;
5953364Ssklower int Aflag = 0;
60*55606Ssklower int Sflag = 1;
6153364Ssklower 
6253364Ssklower char *vmunix = _PATH_UNIX;
6353364Ssklower char *kmemf = 0;
6453364Ssklower struct nlist nl[] = {
65*55606Ssklower #define TP_REFINFO 0
6653364Ssklower {"_tp_refinfo"},
6753364Ssklower 0
6853364Ssklower };
6953364Ssklower struct tp_pcb tp_pcb;
7053364Ssklower 
7153364Ssklower #define kget(p, d) \
7253364Ssklower 	(kvm_read((void *)(p), &(d), sizeof (d)))
main(argc,argv)7353364Ssklower main(argc, argv)
7453364Ssklower 	int argc;
7553364Ssklower 	char **argv;
7653364Ssklower {
7753364Ssklower 	int loc, n;
7853364Ssklower 	char *end;
7953364Ssklower 	argc--; argv++;
80*55606Ssklower 	if ((argc > 0) && strcmp("-k", argv[0]) == 0) {
8153364Ssklower 		vmunix = argv[1];
8253364Ssklower 		kmemf = argv[2];
8353364Ssklower 		argc -= 3;
8453364Ssklower 		argv += 3;
8553364Ssklower 	}
8653364Ssklower 	if (kvm_openfiles(vmunix, kmemf, NULL) == -1) {
8753364Ssklower 		fprintf(stderr, "tpcb: kvm_openfiles: %s\n", kvm_geterr());
8853364Ssklower 		exit(1);
8953364Ssklower 	}
9053364Ssklower 	if (kvm_nlist(nl) < 0 || nl[0].n_type == 0) {
9153364Ssklower 		fprintf(stderr, "%s: no namelist\n", vmunix);
9253364Ssklower 		exit(1);
9353364Ssklower 	}
9453364Ssklower 	if (argc < 1) {
95*55606Ssklower 		doall(nl[TP_REFINFO].n_value);
96*55606Ssklower 		exit(0);
9753364Ssklower 	}
9853364Ssklower 	sscanf(argv[0], "%x", &loc);
9953364Ssklower 	n = kget(loc, tp_pcb);
10053364Ssklower 	parse(--argc, ++argv);
10153364Ssklower }
102*55606Ssklower int column;
10353364Ssklower 
10453364Ssklower #define kdata(t) (data = *(t *)(ti->offset + (char *)&tp_pcb))
10553364Ssklower 
doall(refinfo_off)106*55606Ssklower doall(refinfo_off)
107*55606Ssklower off_t refinfo_off;
108*55606Ssklower {
109*55606Ssklower 	struct tp_refinfo tp_refinfo;
110*55606Ssklower 	register struct tp_pcb **tpp, **tpplim;
111*55606Ssklower 	char *tpr_base, *malloc();
112*55606Ssklower 	int n;
113*55606Ssklower 
114*55606Ssklower 	kget(refinfo_off, tp_refinfo);
115*55606Ssklower 	n = tp_refinfo.tpr_size * sizeof(struct tp_pcb *);
116*55606Ssklower 	if (tp_refinfo.tpr_base && (tpr_base = malloc(n))) {
117*55606Ssklower 		tpp = (struct tp_pcb **)tpr_base;
118*55606Ssklower 		tpplim = tpp + tp_refinfo.tpr_maxopen;
119*55606Ssklower 		bzero(tpr_base, n);
120*55606Ssklower 		kvm_read(tp_refinfo.tpr_base, tpr_base, n);
121*55606Ssklower 		for (n = 0; tpp <= tpplim; tpp++)
122*55606Ssklower 			if (*tpp) {
123*55606Ssklower 				n++;
124*55606Ssklower 				kget(*tpp, tp_pcb);
125*55606Ssklower 				if (Sflag == 0 || tp_pcb.tp_state == TP_OPEN) {
126*55606Ssklower 					printf("\n\npcb at 0x%x:\n", *tpp);
127*55606Ssklower 					parse(0, (char **)"");
128*55606Ssklower 				}
129*55606Ssklower 			}
130*55606Ssklower 		if (n != tp_refinfo.tpr_numopen)
131*55606Ssklower 			printf("\nFound %d of %d expected tpcb's\n",
132*55606Ssklower 				n, tp_refinfo.tpr_numopen);
133*55606Ssklower 	}
134*55606Ssklower }
printone(ti)13553364Ssklower printone(ti)
13653364Ssklower register struct tpcb_info  *ti;
13753364Ssklower {
138*55606Ssklower 	int data = -1;
13953364Ssklower 	switch (ti->size) {
14053364Ssklower 	case 1: kdata(u_char); break;
14153364Ssklower 	case 2: kdata(u_short); break;
14253364Ssklower 	case 4: kdata(u_long); break;
14353364Ssklower 	}
14453364Ssklower 	column += printf("%s 0x%x, ", ti->name, data);
145*55606Ssklower 	if (column > 65 || Sflag) {
14653364Ssklower 		column = 0;
14753364Ssklower 		putchar('\n');
14853364Ssklower 	}
14953364Ssklower }
15053364Ssklower 
parse(argc,argv)15153364Ssklower parse(argc, argv)
15253364Ssklower 	register int argc;
15353364Ssklower 	register char **argv;
15453364Ssklower {
15553364Ssklower 	register struct tpcb_info *ti;
156*55606Ssklower 	column = 0;
15753364Ssklower 	if (argc > 0) {
15853364Ssklower 	    for (; argc-- > 0; argv++)
15953364Ssklower 		for (ti = tpcb_info; ti->name; ti++)
16053364Ssklower 		    if (strcmp(ti->name, *argv) == 0) {
16153364Ssklower 			    printone(ti);
16253364Ssklower 			    break;
16353364Ssklower 		    }
16453364Ssklower 	} else
16553364Ssklower 	    for (ti = tpcb_info; ti->name; ti++)
16653364Ssklower 		printone(ti);
16753364Ssklower }
16853364Ssklower 
16953364Ssklower struct tpcb_info tpcb_info[] = {
17053364Ssklower Entry(next, tp_next),
17153364Ssklower Entry(prev, tp_prev),
17253364Ssklower Entry(nextlisten, tp_nextlisten),
17353364Ssklower Entry(state, tp_state),
17453364Ssklower Entry(retrans, tp_retrans),
17553364Ssklower Entry(npcb, tp_npcb),
17653364Ssklower Entry(nlproto, tp_nlproto),
17753364Ssklower Entry(sock, tp_sock),
17853364Ssklower Entry(lref, tp_lref),
17953364Ssklower Entry(fref, tp_fref),
18053364Ssklower Entry(seqmask, tp_seqmask),
18153364Ssklower Entry(seqbit, tp_seqbit),
18253364Ssklower Entry(seqhalf, tp_seqhalf),
18353364Ssklower Entry(ucddata, tp_ucddata),
184*55606Ssklower Entry(cebit_off, tp_cebit_off),
185*55606Ssklower Entry(oktonagle, tp_oktonagle),
186*55606Ssklower Entry(flags, tp_flags),
18753364Ssklower Entry(fcredit, tp_fcredit),
18853364Ssklower Entry(maxfcredit, tp_maxfcredit),
18953364Ssklower Entry(dupacks, tp_dupacks),
19053364Ssklower Entry(cong_win, tp_cong_win),
19153364Ssklower Entry(ssthresh, tp_ssthresh),
19253364Ssklower Entry(snduna, tp_snduna),
19353364Ssklower Entry(sndnew, tp_sndnew),
19453364Ssklower Entry(sndnum, tp_sndnum),
19553364Ssklower Entry(sndnxt, tp_sndnxt),
19653364Ssklower Entry(sndnxt_m, tp_sndnxt_m),
19753364Ssklower Entry(Nwindow, tp_Nwindow),
19853364Ssklower Entry(rcvnxt, tp_rcvnxt),
19953364Ssklower Entry(sent_lcdt, tp_sent_lcdt),
20053364Ssklower Entry(sent_uwe, tp_sent_uwe),
20153364Ssklower Entry(sent_rcvnxt, tp_sent_rcvnxt),
20253364Ssklower Entry(lcredit, tp_lcredit),
20353364Ssklower Entry(maxlcredit, tp_maxlcredit),
204*55606Ssklower Entry(rhiwat, tp_rhiwat),
20553364Ssklower Entry(rsyq, tp_rsyq),
20653364Ssklower Entry(rsycnt, tp_rsycnt),
20753364Ssklower Entry(win_recv, tp_win_recv),
20853364Ssklower Entry(l_tpdusize, tp_l_tpdusize),
20953364Ssklower Entry(rtv, tp_rtv),
21053364Ssklower Entry(rtt, tp_rtt),
21153364Ssklower Entry(rttseq, tp_rttseq),
21253364Ssklower Entry(rttemit, tp_rttemit),
21353364Ssklower Entry(idle, tp_idle),
21453364Ssklower Entry(rxtcur, tp_rxtcur),
21553364Ssklower Entry(rxtshift, tp_rxtshift),
21653364Ssklower Entry(domain, tp_domain),
21753364Ssklower Entry(fsuffixlen, tp_fsuffixlen),
21853364Ssklower Entry(fsuffix, tp_fsuffix[0]),
21953364Ssklower Entry(lsuffixlen, tp_lsuffixlen),
22053364Ssklower Entry(lsuffix, tp_lsuffix[0]),
22153364Ssklower { "fport", Offsetof(tp_fsuffix[0]), sizeof(short), },
22253364Ssklower { "lport", Offsetof(tp_lsuffix[0]), sizeof(short), },
22353364Ssklower Entry(vers, tp_vers),
22453364Ssklower Entry(peer_acktime, tp_peer_acktime),
22553364Ssklower Entry(refstate, tp_refstate),
22653364Ssklower Entry(fasttimeo, tp_fasttimeo),
22753364Ssklower Entry(inact, tp_timer[TM_inact]),
22853364Ssklower Entry(retrans, tp_timer[TM_retrans]),
22953364Ssklower Entry(sendack, tp_timer[TM_sendack]),
23053364Ssklower Entry(data_retrans, tp_timer[TM_data_retrans]),
23153364Ssklower Entry(reference, tp_timer[TM_reference]),
23253364Ssklower Entry(Xsnd, tp_Xsnd),
23353364Ssklower Entry(Xsndnxt, tp_Xsndnxt),
23453364Ssklower Entry(Xuna, tp_Xuna),
23553364Ssklower Entry(Xrcvnxt, tp_Xrcvnxt),
23653364Ssklower Entry(s_subseq, tp_s_subseq),
23753364Ssklower Entry(r_subseq, tp_r_subseq),
23853364Ssklower Entry(dt_ticks, tp_dt_ticks),
23953364Ssklower Entry(inact_ticks, tp_inact_ticks),
24053364Ssklower Entry(keepalive_ticks, tp_keepalive_ticks),
24153364Ssklower Entry(cr_ticks, tp_cr_ticks),
24253364Ssklower Entry(xpd_ticks, tp_xpd_ticks),
24353364Ssklower 0};
244