trpt.c
来自「<B>Digital的Unix操作系统VAX 4.2源码</B>」· C语言 代码 · 共 340 行
C
340 行
#ifndef lintstatic char *sccsid = "@(#)trpt.c 4.1 (ULTRIX) 7/2/90";#endif lint/************************************************************************ * * * Copyright (c) 1984 by * * Digital Equipment Corporation, Maynard, MA * * All rights reserved. * * * * This software is furnished under a license and may be used and * * copied only in accordance with the terms of such license and * * with the inclusion of the above copyright notice. This * * software or any other copies thereof may not be provided or * * otherwise made available to any other person. No title to and * * ownership of the software is hereby transferred. * * * * This software is derived from software received from the * * University of California, Berkeley, and from Bell * * Laboratories. Use, duplication, or disclosure is subject to * * restrictions under license agreements with University of * * California and with AT&T. * * * * The information in this software is subject to change without * * notice and should not be construed as a commitment by Digital * * Equipment Corporation. * * * * Digital assumes no responsibility for the use or reliability * * of its software on equipment which is not supplied by Digital. * * * ************************************************************************//* static char sccsid[] = "@(#)trpt.c 4.10 7/29/83"; */#include <sys/param.h>#include <sys/socket.h>#include <sys/socketvar.h>#define PRUREQUESTS#include <sys/protosw.h>#include <net/route.h>#include <net/if.h>#include <netinet/in.h>#include <netinet/in_pcb.h>#include <netinet/in_systm.h>#include <netinet/ip.h>#include <netinet/ip_var.h>#include <netinet/tcp.h>#define TCPSTATES#include <netinet/tcp_fsm.h>#include <netinet/tcp_seq.h>#define TCPTIMERS#include <netinet/tcp_timer.h>#include <netinet/tcp_var.h>#include <netinet/tcpip.h>#define TANAMES#include <netinet/tcp_debug.h>#include <stdio.h>#include <errno.h>#include <nlist.h>n_time ntime;int sflag;int tflag;int jflag;int aflag;int numeric();struct nlist nl[] = { { "_tcp_debug" }, { "_tcp_debx" }, 0};struct tcp_debug tcp_debug[TCP_NDEBUG];caddr_t tcp_pcbs[TCP_NDEBUG];int tcp_debx;char *ntoa();char *prurequests[] = PRU_REQLIST;main(argc, argv) int argc; char **argv;{ int i, mask = 0, npcbs = 0; char *system = "/vmunix", *core = "/dev/kmem"; argc--, argv++;again: if (argc > 0 && !strcmp(*argv, "-a")) { aflag++, argc--, argv++; goto again; } if (argc > 0 && !strcmp(*argv, "-s")) { sflag++, argc--, argv++; goto again; } if (argc > 0 && !strcmp(*argv, "-t")) { tflag++, argc--, argv++; goto again; } if (argc > 0 && !strcmp(*argv, "-j")) { jflag++, argc--, argv++; goto again; } if (argc > 0 && !strcmp(*argv, "-p")) { argc--, argv++; if (argc < 1) { fprintf(stderr, "-p: missing tcpcb address\n"); exit(1); } if (npcbs >= TCP_NDEBUG) { fprintf(stderr, "-p: too many pcb's specified\n"); exit(1); } sscanf(*argv, "%x", &tcp_pcbs[npcbs++]); argc--, argv++; goto again; } if (argc > 0) { system = *argv; argc--, argv++; mask++; } if (argc > 0) { core = *argv; argc--, argv++; mask++; } (void) nlist(system, nl); if (nl[0].n_value == 0) { fprintf(stderr, "trpt: %s: no namelist\n", system); exit(1); } (void) close(0); if (open(core, 0) < 0) { fprintf(stderr, "trpt: "); perror(core); exit(2); } if (mask) { nl[0].n_value &= 0x7fffffff; nl[1].n_value &= 0x7fffffff; } (void) lseek(0, nl[1].n_value, 0); if (read(0, &tcp_debx, sizeof (tcp_debx)) != sizeof (tcp_debx)) { fprintf(stderr, "trpt: "); perror("tcp_debx"); exit(3); } printf("tcp_debx=%d\n", tcp_debx); (void) lseek(0, nl[0].n_value, 0); if (read(0, tcp_debug, sizeof (tcp_debug)) != sizeof (tcp_debug)) { fprintf(stderr, "trpt: "); perror("tcp_debug"); exit(3); } /* * If no control blocks have been specified, figure * out how many distinct one we have and summarize * them in tcp_pcbs for sorting the trace records * below. */ if (npcbs == 0) { for (i = 0; i < TCP_NDEBUG; i++) { register int j; register struct tcp_debug *td = &tcp_debug[i]; if (td->td_tcb == 0) continue; for (j = 0; j < npcbs; j++) if (tcp_pcbs[j] == td->td_tcb) break; if (j >= npcbs) tcp_pcbs[npcbs++] = td->td_tcb; } } qsort(tcp_pcbs, npcbs, sizeof (caddr_t), numeric); if (jflag) { char *cp = ""; for (i = 0; i < npcbs; i++) { printf("%s%x", cp, tcp_pcbs[i]); cp = ", "; } if (*cp) putchar('\n'); exit(0); } for (i = 0; i < npcbs; i++) { printf("\n%x:\n", tcp_pcbs[i]); dotrace(tcp_pcbs[i]); } exit(0);}dotrace(tcpcb) register caddr_t tcpcb;{ register int i; register struct tcp_debug *td; for (i = 0; i < tcp_debx % TCP_NDEBUG; i++) { td = &tcp_debug[i]; if (tcpcb && td->td_tcb != tcpcb) continue; ntime = ntohl(td->td_time); tcp_trace(td->td_act, td->td_ostate, td->td_tcb, &td->td_cb, &td->td_ti, td->td_req); } for (i = tcp_debx % TCP_NDEBUG; i < TCP_NDEBUG; i++) { td = &tcp_debug[i]; if (tcpcb && td->td_tcb != tcpcb) continue; ntime = ntohl(td->td_time); tcp_trace(td->td_act, td->td_ostate, td->td_tcb, &td->td_cb, &td->td_ti, td->td_req); }}/* * Tcp debug routines */tcp_trace(act, ostate, atp, tp, ti, req) short act, ostate; struct tcpcb *atp, *tp; struct tcpiphdr *ti; int req;{ tcp_seq seq, ack; int len, flags, win, timer; char *cp; ptime(ntime); printf("%s:%s ", tcpstates[ostate], tanames[act]); switch (act) { case TA_INPUT: case TA_OUTPUT: case TA_DROP: if (aflag) { printf("(src=%s,%d, ", ntoa(ti->ti_src), ntohs(ti->ti_sport)); printf("dst=%s,%d)", ntoa(ti->ti_dst), ntohs(ti->ti_dport)); } seq = ti->ti_seq; ack = ti->ti_ack; len = ti->ti_len; win = ti->ti_win; if (act == TA_OUTPUT) { seq = ntohl(seq); ack = ntohl(ack); len = ntohs(len); win = ntohs(win); } if (act == TA_OUTPUT) len -= sizeof (struct tcphdr); if (len) printf("[%x..%x)", seq, seq+len); else printf("%x", seq); printf("@%x", ack); if (win) printf("(win=%x)", win); flags = ti->ti_flags; if (flags) { char *cp = "<";#define pf(f) { if (ti->ti_flags&TH_/**/f) { printf("%s%s", cp, "f"); cp = ","; } } pf(SYN); pf(ACK); pf(FIN); pf(RST); pf(PUSH); pf(URG); printf(">"); } break; case TA_USER: timer = req >> 8; req &= 0xff; printf("%s", prurequests[req]); if (req == PRU_SLOWTIMO || req == PRU_FASTTIMO) printf("<%s>", tcptimers[timer]); break; } printf(" -> %s", tcpstates[tp->t_state]); /* print out internal state of tp !?! */ printf("\n"); if (sflag) { printf("\trcv_nxt %x rcv_wnd %x snd_una %x snd_nxt %x snd_max %x\n", tp->rcv_nxt, tp->rcv_wnd, tp->snd_una, tp->snd_nxt, tp->snd_max); printf("\tsnd_wl1 %x snd_wl2 %x snd_wnd %x\n", tp->snd_wl1, tp->snd_wl2, tp->snd_wnd); } /* print out timers? */ if (tflag) { char *cp = "\t"; register int i; for (i = 0; i < TCPT_NTIMERS; i++) { if (tp->t_timer[i] == 0) continue; printf("%s%s=%d", cp, tcptimers[i], tp->t_timer[i]); if (i == TCPT_REXMT) printf(" (t_rxtshft=%d)", tp->t_rxtshift); cp = ", "; } if (*cp != '\t') putchar('\n'); }}ptime(ms) int ms;{ printf("%03d ", (ms/10) % 1000);}numeric(c1, c2) caddr_t *c1, *c2;{ return (*c1 - *c2);}/* * Convert network-format internet address * to base 256 d.d.d.d representation. */char *ntoa(in) struct in_addr in;{ static char b[18]; register char *p; in.s_addr = ntohl(in.s_addr); p = (char *)∈#define UC(b) (((int)b)&0xff) sprintf(b, "%d.%d.%d.%d", UC(p[0]), UC(p[1]), UC(p[2]), UC(p[3])); return (b);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?