1*6463Swnj #ifndef lint 2*6463Swnj static char sccsid[] = "@(#)trpt.c 4.1 82/04/02"; 3*6463Swnj #endif 4*6463Swnj 5*6463Swnj #include <sys/param.h> 6*6463Swnj #include <sys/socket.h> 7*6463Swnj #include <sys/socketvar.h> 8*6463Swnj #define PRUREQUESTS 9*6463Swnj #include <sys/protosw.h> 10*6463Swnj #include <net/in.h> 11*6463Swnj #include <net/route.h> 12*6463Swnj #include <net/in_pcb.h> 13*6463Swnj #include <net/in_systm.h> 14*6463Swnj #include <net/if.h> 15*6463Swnj #include <net/ip.h> 16*6463Swnj #include <net/ip_var.h> 17*6463Swnj #include <net/tcp.h> 18*6463Swnj #define TCPSTATES 19*6463Swnj #include <net/tcp_fsm.h> 20*6463Swnj #include <net/tcp_seq.h> 21*6463Swnj #define TCPTIMERS 22*6463Swnj #include <net/tcp_timer.h> 23*6463Swnj #include <net/tcp_var.h> 24*6463Swnj #include <net/tcpip.h> 25*6463Swnj #define TANAMES 26*6463Swnj #include <net/tcp_debug.h> 27*6463Swnj #include <errno.h> 28*6463Swnj 29*6463Swnj #include <nlist.h> 30*6463Swnj 31*6463Swnj n_time ntime; 32*6463Swnj int sflag; 33*6463Swnj struct nlist nl[] = { 34*6463Swnj { "_tcp_debug" }, 35*6463Swnj { "_tcp_debx" }, 36*6463Swnj 0 37*6463Swnj }; 38*6463Swnj struct tcp_debug tcp_debug[TCP_NDEBUG]; 39*6463Swnj int tcp_debx; 40*6463Swnj 41*6463Swnj main(argc, argv) 42*6463Swnj int argc; 43*6463Swnj char **argv; 44*6463Swnj { 45*6463Swnj int i; 46*6463Swnj 47*6463Swnj argc--, argv++; 48*6463Swnj again: 49*6463Swnj if (argc > 0 && !strcmp(*argv, "-s")) { 50*6463Swnj sflag++, argc--, argv++; 51*6463Swnj goto again; 52*6463Swnj } 53*6463Swnj nlist(argc > 0 ? *argv : "/vmunix", nl); 54*6463Swnj if (nl[0].n_value == 0) { 55*6463Swnj printf("no namelist\n"); 56*6463Swnj exit(1); 57*6463Swnj } 58*6463Swnj close(0); 59*6463Swnj open(argc > 1 ? argv[1] : "/dev/kmem", 0); 60*6463Swnj if (argc > 1) { 61*6463Swnj nl[0].n_value &= 0x7fffffff; 62*6463Swnj nl[1].n_value &= 0x7fffffff; 63*6463Swnj } 64*6463Swnj lseek(0, nl[1].n_value, 0); 65*6463Swnj read(0, &tcp_debx, sizeof (tcp_debx)); 66*6463Swnj printf("tcp_debx=%d\n", tcp_debx); 67*6463Swnj lseek(0, nl[0].n_value, 0); 68*6463Swnj read(0, tcp_debug, sizeof (tcp_debug)); 69*6463Swnj for (i = tcp_debx % TCP_NDEBUG; i < TCP_NDEBUG; i++) { 70*6463Swnj struct tcp_debug *td = &tcp_debug[i]; 71*6463Swnj ntime = td->td_time; 72*6463Swnj #if vax 73*6463Swnj ntime = ntohl(ntime); 74*6463Swnj #endif 75*6463Swnj tcp_trace(td->td_act, td->td_ostate, td->td_tcb, &td->td_cb, 76*6463Swnj &td->td_ti, td->td_req); 77*6463Swnj } 78*6463Swnj for (i = 0; i < tcp_debx % TCP_NDEBUG; i++) { 79*6463Swnj struct tcp_debug *td = &tcp_debug[i]; 80*6463Swnj ntime = td->td_time; 81*6463Swnj #if vax 82*6463Swnj ntime = ntohl(ntime); 83*6463Swnj #endif 84*6463Swnj tcp_trace(td->td_act, td->td_ostate, td->td_tcb, &td->td_cb, 85*6463Swnj &td->td_ti, td->td_req); 86*6463Swnj } 87*6463Swnj exit(0); 88*6463Swnj } 89*6463Swnj 90*6463Swnj /* 91*6463Swnj * Tcp debug routines 92*6463Swnj */ 93*6463Swnj tcp_trace(act, ostate, atp, tp, ti, req) 94*6463Swnj short act, ostate; 95*6463Swnj struct tcpcb *atp, *tp; 96*6463Swnj struct tcpiphdr *ti; 97*6463Swnj int req; 98*6463Swnj { 99*6463Swnj tcp_seq seq, ack; 100*6463Swnj int len, flags, win; 101*6463Swnj char *cp; 102*6463Swnj 103*6463Swnj ptime(ntime); 104*6463Swnj printf("%x %s:%s ", ((int)atp)&0xfffff, 105*6463Swnj tcpstates[ostate], tanames[act]); 106*6463Swnj switch (act) { 107*6463Swnj 108*6463Swnj case TA_INPUT: 109*6463Swnj case TA_OUTPUT: 110*6463Swnj seq = ti->ti_seq; 111*6463Swnj ack = ti->ti_ack; 112*6463Swnj len = ti->ti_len; 113*6463Swnj win = ti->ti_win; 114*6463Swnj #if vax 115*6463Swnj if (act == TA_OUTPUT) { 116*6463Swnj seq = ntohl(seq); 117*6463Swnj ack = ntohl(ack); 118*6463Swnj len = ntohs(len); 119*6463Swnj win = ntohs(win); 120*6463Swnj } 121*6463Swnj #endif 122*6463Swnj if (act == TA_OUTPUT) 123*6463Swnj len -= sizeof (struct tcphdr); 124*6463Swnj if (len) 125*6463Swnj printf("[%x..%x)", seq, seq+len); 126*6463Swnj else 127*6463Swnj printf("%x", seq); 128*6463Swnj printf("@%x", ack); 129*6463Swnj if (win) 130*6463Swnj printf("(win=%d)", win); 131*6463Swnj flags = ti->ti_flags; 132*6463Swnj if (flags) { 133*6463Swnj char *cp = "<"; 134*6463Swnj #define pf(f) { if (ti->ti_flags&TH_/**/f) { printf("%s%s", cp, "f"); cp = ","; } } 135*6463Swnj pf(SYN); pf(ACK); pf(FIN); pf(RST); pf(URG); 136*6463Swnj printf(">"); 137*6463Swnj } 138*6463Swnj break; 139*6463Swnj 140*6463Swnj case TA_USER: 141*6463Swnj printf("%s", prurequests[req&0xff]); 142*6463Swnj if (req >> 8) 143*6463Swnj printf("<%s>", tcptimers[req>>8]); 144*6463Swnj break; 145*6463Swnj } 146*6463Swnj printf(" -> %s", tcpstates[tp->t_state]); 147*6463Swnj /* print out internal state of tp !?! */ 148*6463Swnj printf("\n"); 149*6463Swnj if (sflag) { 150*6463Swnj printf("\trcv_nxt %x rcv_wnd %d snd_una %x snd_nxt %x snd_max %x\n", 151*6463Swnj tp->rcv_nxt, tp->rcv_wnd, tp->snd_una, tp->snd_nxt, tp->snd_max); 152*6463Swnj printf("\tsnd_wl1 %x snd_wl2 %x snd_wnd %x\n", tp->snd_wl1, tp->snd_wl2, tp->snd_wnd); 153*6463Swnj } 154*6463Swnj } 155*6463Swnj 156*6463Swnj ptime(ms) 157*6463Swnj int ms; 158*6463Swnj { 159*6463Swnj 160*6463Swnj printf("%03d ", (ms/10) % 1000); 161*6463Swnj } 162