date and time created 82/04/02 10:29:14 by wnj
authorBill Joy <wnj@ucbvax.Berkeley.EDU>
Sat, 3 Apr 1982 01:29:14 +0000 (17:29 -0800)
committerBill Joy <wnj@ucbvax.Berkeley.EDU>
Sat, 3 Apr 1982 01:29:14 +0000 (17:29 -0800)
SCCS-vsn: usr.sbin/trpt/trpt.c 4.1

usr/src/usr.sbin/trpt/trpt.c [new file with mode: 0644]

diff --git a/usr/src/usr.sbin/trpt/trpt.c b/usr/src/usr.sbin/trpt/trpt.c
new file mode 100644 (file)
index 0000000..a050c4a
--- /dev/null
@@ -0,0 +1,161 @@
+#ifndef lint
+static char sccsid[] = "@(#)trpt.c     4.1 82/04/02";
+#endif
+
+#include <sys/param.h>
+#include <sys/socket.h>
+#include <sys/socketvar.h>
+#define PRUREQUESTS
+#include <sys/protosw.h>
+#include <net/in.h>
+#include <net/route.h>
+#include <net/in_pcb.h>
+#include <net/in_systm.h>
+#include <net/if.h>
+#include <net/ip.h>
+#include <net/ip_var.h>
+#include <net/tcp.h>
+#define TCPSTATES
+#include <net/tcp_fsm.h>
+#include <net/tcp_seq.h>
+#define        TCPTIMERS
+#include <net/tcp_timer.h>
+#include <net/tcp_var.h>
+#include <net/tcpip.h>
+#define        TANAMES
+#include <net/tcp_debug.h>
+#include <errno.h>
+
+#include <nlist.h>
+
+n_time ntime;
+int    sflag;
+struct nlist nl[] = {
+       { "_tcp_debug" },
+       { "_tcp_debx" },
+       0
+};
+struct tcp_debug tcp_debug[TCP_NDEBUG];
+int    tcp_debx;
+
+main(argc, argv)
+       int argc;
+       char **argv;
+{
+       int i;
+
+       argc--, argv++;
+again:
+       if (argc > 0 && !strcmp(*argv, "-s")) {
+               sflag++, argc--, argv++;
+               goto again;
+       }
+       nlist(argc > 0 ? *argv : "/vmunix", nl);
+       if (nl[0].n_value == 0) {
+               printf("no namelist\n");
+               exit(1);
+       }
+       close(0);
+       open(argc > 1 ? argv[1] : "/dev/kmem", 0);
+       if (argc > 1) {
+               nl[0].n_value &= 0x7fffffff;
+               nl[1].n_value &= 0x7fffffff;
+       }
+       lseek(0, nl[1].n_value, 0);
+       read(0, &tcp_debx, sizeof (tcp_debx));
+       printf("tcp_debx=%d\n", tcp_debx);
+       lseek(0, nl[0].n_value, 0);
+       read(0, tcp_debug, sizeof (tcp_debug));
+       for (i = tcp_debx % TCP_NDEBUG; i < TCP_NDEBUG; i++) {
+               struct tcp_debug *td = &tcp_debug[i];
+               ntime = td->td_time;
+#if vax
+               ntime = ntohl(ntime);
+#endif
+               tcp_trace(td->td_act, td->td_ostate, td->td_tcb, &td->td_cb,
+                   &td->td_ti, td->td_req);
+       }
+       for (i = 0; i < tcp_debx % TCP_NDEBUG; i++) {
+               struct tcp_debug *td = &tcp_debug[i];
+               ntime = td->td_time;
+#if vax
+               ntime = ntohl(ntime);
+#endif
+               tcp_trace(td->td_act, td->td_ostate, td->td_tcb, &td->td_cb,
+                   &td->td_ti, td->td_req);
+       }
+       exit(0);
+}
+
+/*
+ * 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;
+       char *cp;
+
+       ptime(ntime);
+       printf("%x %s:%s ", ((int)atp)&0xfffff,
+           tcpstates[ostate], tanames[act]);
+       switch (act) {
+
+       case TA_INPUT:
+       case TA_OUTPUT:
+               seq = ti->ti_seq;
+               ack = ti->ti_ack;
+               len = ti->ti_len;
+               win = ti->ti_win;
+#if vax
+               if (act == TA_OUTPUT) {
+                       seq = ntohl(seq);
+                       ack = ntohl(ack);
+                       len = ntohs(len);
+                       win = ntohs(win);
+               }
+#endif
+               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=%d)", 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(URG);
+                       printf(">");
+               }
+               break;
+
+       case TA_USER:
+               printf("%s", prurequests[req&0xff]);
+               if (req >> 8)
+                       printf("<%s>", tcptimers[req>>8]);
+               break;
+       }
+       printf(" -> %s", tcpstates[tp->t_state]);
+       /* print out internal state of tp !?! */
+       printf("\n");
+       if (sflag) {
+               printf("\trcv_nxt %x rcv_wnd %d 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);
+       }
+}
+
+ptime(ms)
+       int ms;
+{
+
+       printf("%03d ", (ms/10) % 1000);
+}