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