Annotation of 43BSDTahoe/etc/trpt.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1983, 1988 Regents of the University of California.
        !             3:  * All rights reserved.
        !             4:  *
        !             5:  * Redistribution and use in source and binary forms are permitted
        !             6:  * provided that the above copyright notice and this paragraph are
        !             7:  * duplicated in all such forms and that any documentation,
        !             8:  * advertising materials, and other materials related to such
        !             9:  * distribution and use acknowledge that the software was developed
        !            10:  * by the University of California, Berkeley.  The name of the
        !            11:  * University may not be used to endorse or promote products derived
        !            12:  * from this software without specific prior written permission.
        !            13:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
        !            14:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
        !            15:  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !            16:  */
        !            17: 
        !            18: #ifndef lint
        !            19: char copyright[] =
        !            20: "@(#) Copyright (c) 1983, 1988 Regents of the University of California.\n\
        !            21:  All rights reserved.\n";
        !            22: #endif /* not lint */
        !            23: 
        !            24: #ifndef lint
        !            25: static char sccsid[] = "@(#)trpt.c     5.5 (Berkeley) 7/1/88";
        !            26: #endif /* not lint */
        !            27: 
        !            28: #include <machine/pte.h>
        !            29: 
        !            30: #include <sys/param.h>
        !            31: #include <sys/vmmac.h>
        !            32: #include <sys/socket.h>
        !            33: #include <sys/socketvar.h>
        !            34: #define PRUREQUESTS
        !            35: #include <sys/protosw.h>
        !            36: #include <sys/file.h>
        !            37: 
        !            38: #include <net/route.h>
        !            39: #include <net/if.h>
        !            40: 
        !            41: #include <netinet/in.h>
        !            42: #include <netinet/in_pcb.h>
        !            43: #include <netinet/in_systm.h>
        !            44: #include <netinet/ip.h>
        !            45: #include <netinet/ip_var.h>
        !            46: #include <netinet/tcp.h>
        !            47: #define TCPSTATES
        !            48: #include <netinet/tcp_fsm.h>
        !            49: #include <netinet/tcp_seq.h>
        !            50: #define        TCPTIMERS
        !            51: #include <netinet/tcp_timer.h>
        !            52: #include <netinet/tcp_var.h>
        !            53: #include <netinet/tcpip.h>
        !            54: #define        TANAMES
        !            55: #include <netinet/tcp_debug.h>
        !            56: 
        !            57: #include <arpa/inet.h>
        !            58: 
        !            59: #include <stdio.h>
        !            60: #include <errno.h>
        !            61: #include <nlist.h>
        !            62: 
        !            63: struct nlist nl[] = {
        !            64: #define        N_TCP_DEBUG     0
        !            65:        { "_tcp_debug" },
        !            66: #define        N_TCP_DEBX      1
        !            67:        { "_tcp_debx" },
        !            68: #define        N_SYSMAP        2
        !            69:        { "_Sysmap" },
        !            70: #define        N_SYSSIZE       3
        !            71:        { "_Syssize" },
        !            72:        { "" },
        !            73: };
        !            74: 
        !            75: static struct pte      *Sysmap;
        !            76: static struct tcp_debug        tcp_debug[TCP_NDEBUG];
        !            77: static caddr_t tcp_pcbs[TCP_NDEBUG];
        !            78: static n_time  ntime;
        !            79: static int     aflag, kflag, memf, follow, sflag, tcp_debx, tflag;
        !            80: 
        !            81: main(argc, argv)
        !            82:        int argc;
        !            83:        char **argv;
        !            84: {
        !            85:        extern char *optarg;
        !            86:        extern int optind;
        !            87:        int ch, i, jflag, npcbs, numeric();
        !            88:        char *system, *core, *malloc();
        !            89:        off_t lseek();
        !            90: 
        !            91:        jflag = npcbs = 0;
        !            92:        while ((ch = getopt(argc, argv, "afjp:st")) != EOF)
        !            93:                switch((char)ch) {
        !            94:                case 'a':
        !            95:                        ++aflag;
        !            96:                        break;
        !            97:                case 'f':
        !            98:                        ++follow;
        !            99:                        setlinebuf(stdout);
        !           100:                        break;
        !           101:                case 'j':
        !           102:                        ++jflag;
        !           103:                        break;
        !           104:                case 'p':
        !           105:                        if (npcbs >= TCP_NDEBUG) {
        !           106:                                fputs("trpt: too many pcb's specified\n",
        !           107:                                    stderr);
        !           108:                                exit(1);
        !           109:                        }
        !           110:                        (void)sscanf(optarg, "%x", (int *)&tcp_pcbs[npcbs++]);
        !           111:                        break;
        !           112:                case 's':
        !           113:                        ++sflag;
        !           114:                        break;
        !           115:                case 't':
        !           116:                        ++tflag;
        !           117:                        break;
        !           118:                case '?':
        !           119:                default:
        !           120:                        fputs("usage: trpt [-afjst] [-p hex-address] [system [core]]\n", stderr);
        !           121:                        exit(1);
        !           122:                }
        !           123:        argc -= optind;
        !           124:        argv += optind;
        !           125: 
        !           126:        core = "/dev/kmem";
        !           127:        if (argc > 0) {
        !           128:                system = *argv;
        !           129:                argc--, argv++;
        !           130:                if (argc > 0) {
        !           131:                        core = *argv;
        !           132:                        argc--, argv++;
        !           133:                        ++kflag;
        !           134:                }
        !           135:        }
        !           136:        else
        !           137:                system = "/vmunix";
        !           138: 
        !           139:        if (nlist(system, nl) < 0 || !nl[0].n_value) {
        !           140:                fprintf(stderr, "trpt: %s: no namelist\n", system);
        !           141:                exit(1);
        !           142:        }
        !           143:        if ((memf = open(core, O_RDONLY)) < 0) {
        !           144:                perror(core);
        !           145:                exit(2);
        !           146:        }
        !           147:        if (kflag) {
        !           148:                off_t off;
        !           149: 
        !           150:                Sysmap = (struct pte *)
        !           151:                   malloc((u_int)(nl[N_SYSSIZE].n_value * sizeof(struct pte)));
        !           152:                if (!Sysmap) {
        !           153:                        fputs("arp: can't get memory for Sysmap.\n", stderr);
        !           154:                        exit(1);
        !           155:                }
        !           156:                off = nl[N_SYSMAP].n_value & ~KERNBASE;
        !           157:                (void)lseek(memf, off, L_SET);
        !           158:                (void)read(memf, (char *)Sysmap,
        !           159:                    (int)(nl[N_SYSSIZE].n_value * sizeof(struct pte)));
        !           160:        }
        !           161:        (void)klseek(memf, (off_t)nl[N_TCP_DEBX].n_value, L_SET);
        !           162:        if (read(memf, (char *)&tcp_debx, sizeof(tcp_debx)) !=
        !           163:            sizeof(tcp_debx)) {
        !           164:                perror("trpt: tcp_debx");
        !           165:                exit(3);
        !           166:        }
        !           167:        (void)klseek(memf, (off_t)nl[N_TCP_DEBUG].n_value, L_SET);
        !           168:        if (read(memf, (char *)tcp_debug, sizeof(tcp_debug)) !=
        !           169:            sizeof(tcp_debug)) {
        !           170:                perror("trpt: tcp_debug");
        !           171:                exit(3);
        !           172:        }
        !           173:        /*
        !           174:         * If no control blocks have been specified, figure
        !           175:         * out how many distinct one we have and summarize
        !           176:         * them in tcp_pcbs for sorting the trace records
        !           177:         * below.
        !           178:         */
        !           179:        if (!npcbs) {
        !           180:                for (i = 0; i < TCP_NDEBUG; i++) {
        !           181:                        register struct tcp_debug *td = &tcp_debug[i];
        !           182:                        register int j;
        !           183: 
        !           184:                        if (td->td_tcb == 0)
        !           185:                                continue;
        !           186:                        for (j = 0; j < npcbs; j++)
        !           187:                                if (tcp_pcbs[j] == td->td_tcb)
        !           188:                                        break;
        !           189:                        if (j >= npcbs)
        !           190:                                tcp_pcbs[npcbs++] = td->td_tcb;
        !           191:                }
        !           192:                if (!npcbs)
        !           193:                        exit(0);
        !           194:        }
        !           195:        qsort(tcp_pcbs, npcbs, sizeof(caddr_t), numeric);
        !           196:        if (jflag) {
        !           197:                for (i = 0;;) {
        !           198:                        printf("%x", (int)tcp_pcbs[i]);
        !           199:                        if (++i == npcbs)
        !           200:                                break;
        !           201:                        fputs(", ", stdout);
        !           202:                }
        !           203:                putchar('\n');
        !           204:        }
        !           205:        else for (i = 0; i < npcbs; i++) {
        !           206:                printf("\n%x:\n", (int)tcp_pcbs[i]);
        !           207:                dotrace(tcp_pcbs[i]);
        !           208:        }
        !           209:        exit(0);
        !           210: }
        !           211: 
        !           212: dotrace(tcpcb)
        !           213:        register caddr_t tcpcb;
        !           214: {
        !           215:        register struct tcp_debug *td;
        !           216:        register int i;
        !           217:        int prev_debx = tcp_debx;
        !           218: 
        !           219: again: if (--tcp_debx < 0)
        !           220:                tcp_debx = TCP_NDEBUG - 1;
        !           221:        for (i = prev_debx % TCP_NDEBUG; i < TCP_NDEBUG; i++) {
        !           222:                td = &tcp_debug[i];
        !           223:                if (tcpcb && td->td_tcb != tcpcb)
        !           224:                        continue;
        !           225:                ntime = ntohl(td->td_time);
        !           226:                tcp_trace(td->td_act, td->td_ostate, td->td_tcb, &td->td_cb,
        !           227:                    &td->td_ti, td->td_req);
        !           228:                if (i == tcp_debx)
        !           229:                        goto done;
        !           230:        }
        !           231:        for (i = 0; i <= tcp_debx % TCP_NDEBUG; i++) {
        !           232:                td = &tcp_debug[i];
        !           233:                if (tcpcb && td->td_tcb != tcpcb)
        !           234:                        continue;
        !           235:                ntime = ntohl(td->td_time);
        !           236:                tcp_trace(td->td_act, td->td_ostate, td->td_tcb, &td->td_cb,
        !           237:                    &td->td_ti, td->td_req);
        !           238:        }
        !           239: done:  if (follow) {
        !           240:                prev_debx = tcp_debx + 1;
        !           241:                if (prev_debx >= TCP_NDEBUG)
        !           242:                        prev_debx = 0;
        !           243:                do {
        !           244:                        sleep(1);
        !           245:                        (void)klseek(memf, (off_t)nl[N_TCP_DEBX].n_value, L_SET);
        !           246:                        if (read(memf, (char *)&tcp_debx, sizeof(tcp_debx)) !=
        !           247:                            sizeof(tcp_debx)) {
        !           248:                                perror("trpt: tcp_debx");
        !           249:                                exit(3);
        !           250:                        }
        !           251:                } while (tcp_debx == prev_debx);
        !           252:                (void)klseek(memf, (off_t)nl[N_TCP_DEBUG].n_value, L_SET);
        !           253:                if (read(memf, (char *)tcp_debug, sizeof(tcp_debug)) !=
        !           254:                    sizeof(tcp_debug)) {
        !           255:                        perror("trpt: tcp_debug");
        !           256:                        exit(3);
        !           257:                }
        !           258:                goto again;
        !           259:        }
        !           260: }
        !           261: 
        !           262: /*
        !           263:  * Tcp debug routines
        !           264:  */
        !           265: /*ARGSUSED*/
        !           266: tcp_trace(act, ostate, atp, tp, ti, req)
        !           267:        short act, ostate;
        !           268:        struct tcpcb *atp, *tp;
        !           269:        struct tcpiphdr *ti;
        !           270:        int req;
        !           271: {
        !           272:        tcp_seq seq, ack;
        !           273:        int flags, len, win, timer;
        !           274: 
        !           275:        printf("%03ld %s:%s ",(ntime/10) % 1000, tcpstates[ostate],
        !           276:            tanames[act]);
        !           277:        switch (act) {
        !           278:        case TA_INPUT:
        !           279:        case TA_OUTPUT:
        !           280:        case TA_DROP:
        !           281:                if (aflag)
        !           282:                        printf("(src=%s,%u, dst=%s,%u)", inet_ntoa(ti->ti_src),
        !           283:                            ntohs(ti->ti_sport), inet_ntoa(ti->ti_dst),
        !           284:                            ntohs(ti->ti_dport));
        !           285:                seq = ti->ti_seq;
        !           286:                ack = ti->ti_ack;
        !           287:                len = ti->ti_len;
        !           288:                win = ti->ti_win;
        !           289:                if (act == TA_OUTPUT) {
        !           290:                        seq = ntohl(seq);
        !           291:                        ack = ntohl(ack);
        !           292:                        len = ntohs(len);
        !           293:                        win = ntohs(win);
        !           294:                }
        !           295:                if (act == TA_OUTPUT)
        !           296:                        len -= sizeof(struct tcphdr);
        !           297:                if (len)
        !           298:                        printf("[%lx..%lx)", seq, seq + len);
        !           299:                else
        !           300:                        printf("%lx", seq);
        !           301:                printf("@%lx", ack);
        !           302:                if (win)
        !           303:                        printf("(win=%x)", win);
        !           304:                flags = ti->ti_flags;
        !           305:                if (flags) {
        !           306:                        register char *cp = "<";
        !           307: #define        pf(flag) { \
        !           308:        if (ti->ti_flags&flag) \
        !           309:                printf("%s%s", cp, "f"); \
        !           310:                cp = ","; \
        !           311:        }
        !           312:                        pf(TH_SYN);
        !           313:                        pf(TH_ACK);
        !           314:                        pf(TH_FIN);
        !           315:                        pf(TH_RST);
        !           316:                        pf(TH_PUSH);
        !           317:                        pf(TH_URG);
        !           318:                        printf(">");
        !           319:                }
        !           320:                break;
        !           321:        case TA_USER:
        !           322:                timer = req >> 8;
        !           323:                req &= 0xff;
        !           324:                printf("%s", prurequests[req]);
        !           325:                if (req == PRU_SLOWTIMO || req == PRU_FASTTIMO)
        !           326:                        printf("<%s>", tcptimers[timer]);
        !           327:                break;
        !           328:        }
        !           329:        printf(" -> %s", tcpstates[tp->t_state]);
        !           330:        /* print out internal state of tp !?! */
        !           331:        printf("\n");
        !           332:        if (sflag) {
        !           333:                printf("\trcv_nxt %lx rcv_wnd %x snd_una %lx snd_nxt %lx snd_max %lx\n",
        !           334:                    tp->rcv_nxt, tp->rcv_wnd, tp->snd_una, tp->snd_nxt,
        !           335:                    tp->snd_max);
        !           336:                printf("\tsnd_wl1 %lx snd_wl2 %lx snd_wnd %x\n", tp->snd_wl1,
        !           337:                    tp->snd_wl2, tp->snd_wnd);
        !           338:        }
        !           339:        /* print out timers? */
        !           340:        if (tflag) {
        !           341:                register char *cp = "\t";
        !           342:                register int i;
        !           343: 
        !           344:                for (i = 0; i < TCPT_NTIMERS; i++) {
        !           345:                        if (tp->t_timer[i] == 0)
        !           346:                                continue;
        !           347:                        printf("%s%s=%d", cp, tcptimers[i], tp->t_timer[i]);
        !           348:                        if (i == TCPT_REXMT)
        !           349:                                printf(" (t_rxtshft=%d)", tp->t_rxtshift);
        !           350:                        cp = ", ";
        !           351:                }
        !           352:                if (*cp != '\t')
        !           353:                        putchar('\n');
        !           354:        }
        !           355: }
        !           356: 
        !           357: numeric(c1, c2)
        !           358:        caddr_t *c1, *c2;
        !           359: {
        !           360:        return(*c1 - *c2);
        !           361: }
        !           362: 
        !           363: klseek(fd, base, off)
        !           364:        int fd, off;
        !           365:        off_t base;
        !           366: {
        !           367:        off_t lseek();
        !           368: 
        !           369:        if (kflag) {    /* get kernel pte */
        !           370:                base &= ~KERNBASE;
        !           371:                base = ctob(Sysmap[btop(base)].pg_pfnum) + (base & PGOFSET);
        !           372:        }
        !           373:        (void)lseek(fd, base, off);
        !           374: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.