16463Swnj #ifndef lint 2*8382Ssam static char sccsid[] = "@(#)trpt.c 4.2 82/10/07"; 36463Swnj #endif 46463Swnj 56463Swnj #include <sys/param.h> 66463Swnj #include <sys/socket.h> 76463Swnj #include <sys/socketvar.h> 86463Swnj #define PRUREQUESTS 96463Swnj #include <sys/protosw.h> 106463Swnj #include <net/in.h> 116463Swnj #include <net/route.h> 126463Swnj #include <net/in_pcb.h> 136463Swnj #include <net/in_systm.h> 146463Swnj #include <net/if.h> 156463Swnj #include <net/ip.h> 166463Swnj #include <net/ip_var.h> 176463Swnj #include <net/tcp.h> 186463Swnj #define TCPSTATES 196463Swnj #include <net/tcp_fsm.h> 206463Swnj #include <net/tcp_seq.h> 216463Swnj #define TCPTIMERS 226463Swnj #include <net/tcp_timer.h> 236463Swnj #include <net/tcp_var.h> 246463Swnj #include <net/tcpip.h> 256463Swnj #define TANAMES 266463Swnj #include <net/tcp_debug.h> 276463Swnj #include <errno.h> 286463Swnj 296463Swnj #include <nlist.h> 306463Swnj 316463Swnj n_time ntime; 326463Swnj int sflag; 336463Swnj struct nlist nl[] = { 346463Swnj { "_tcp_debug" }, 356463Swnj { "_tcp_debx" }, 366463Swnj 0 376463Swnj }; 386463Swnj struct tcp_debug tcp_debug[TCP_NDEBUG]; 396463Swnj int tcp_debx; 406463Swnj 416463Swnj main(argc, argv) 426463Swnj int argc; 436463Swnj char **argv; 446463Swnj { 456463Swnj int i; 466463Swnj 476463Swnj argc--, argv++; 486463Swnj again: 496463Swnj if (argc > 0 && !strcmp(*argv, "-s")) { 506463Swnj sflag++, argc--, argv++; 516463Swnj goto again; 526463Swnj } 536463Swnj nlist(argc > 0 ? *argv : "/vmunix", nl); 546463Swnj if (nl[0].n_value == 0) { 556463Swnj printf("no namelist\n"); 566463Swnj exit(1); 576463Swnj } 586463Swnj close(0); 596463Swnj open(argc > 1 ? argv[1] : "/dev/kmem", 0); 606463Swnj if (argc > 1) { 616463Swnj nl[0].n_value &= 0x7fffffff; 626463Swnj nl[1].n_value &= 0x7fffffff; 636463Swnj } 646463Swnj lseek(0, nl[1].n_value, 0); 656463Swnj read(0, &tcp_debx, sizeof (tcp_debx)); 666463Swnj printf("tcp_debx=%d\n", tcp_debx); 676463Swnj lseek(0, nl[0].n_value, 0); 686463Swnj read(0, tcp_debug, sizeof (tcp_debug)); 696463Swnj for (i = tcp_debx % TCP_NDEBUG; i < TCP_NDEBUG; i++) { 706463Swnj struct tcp_debug *td = &tcp_debug[i]; 71*8382Ssam 72*8382Ssam ntime = ntohl(td->td_time); 736463Swnj tcp_trace(td->td_act, td->td_ostate, td->td_tcb, &td->td_cb, 746463Swnj &td->td_ti, td->td_req); 756463Swnj } 766463Swnj for (i = 0; i < tcp_debx % TCP_NDEBUG; i++) { 776463Swnj struct tcp_debug *td = &tcp_debug[i]; 78*8382Ssam 79*8382Ssam ntime = ntohl(td->td_time); 806463Swnj tcp_trace(td->td_act, td->td_ostate, td->td_tcb, &td->td_cb, 816463Swnj &td->td_ti, td->td_req); 826463Swnj } 836463Swnj exit(0); 846463Swnj } 856463Swnj 866463Swnj /* 876463Swnj * Tcp debug routines 886463Swnj */ 896463Swnj tcp_trace(act, ostate, atp, tp, ti, req) 906463Swnj short act, ostate; 916463Swnj struct tcpcb *atp, *tp; 926463Swnj struct tcpiphdr *ti; 936463Swnj int req; 946463Swnj { 956463Swnj tcp_seq seq, ack; 96*8382Ssam int len, flags, win, timer; 976463Swnj char *cp; 986463Swnj 996463Swnj ptime(ntime); 1006463Swnj printf("%x %s:%s ", ((int)atp)&0xfffff, 1016463Swnj tcpstates[ostate], tanames[act]); 1026463Swnj switch (act) { 1036463Swnj 1046463Swnj case TA_INPUT: 1056463Swnj case TA_OUTPUT: 1066463Swnj seq = ti->ti_seq; 1076463Swnj ack = ti->ti_ack; 1086463Swnj len = ti->ti_len; 1096463Swnj win = ti->ti_win; 110*8382Ssam #if vax || pdp11 1116463Swnj if (act == TA_OUTPUT) { 1126463Swnj seq = ntohl(seq); 1136463Swnj ack = ntohl(ack); 1146463Swnj len = ntohs(len); 1156463Swnj win = ntohs(win); 1166463Swnj } 1176463Swnj #endif 1186463Swnj if (act == TA_OUTPUT) 1196463Swnj len -= sizeof (struct tcphdr); 1206463Swnj if (len) 1216463Swnj printf("[%x..%x)", seq, seq+len); 1226463Swnj else 1236463Swnj printf("%x", seq); 1246463Swnj printf("@%x", ack); 1256463Swnj if (win) 1266463Swnj printf("(win=%d)", win); 1276463Swnj flags = ti->ti_flags; 1286463Swnj if (flags) { 1296463Swnj char *cp = "<"; 1306463Swnj #define pf(f) { if (ti->ti_flags&TH_/**/f) { printf("%s%s", cp, "f"); cp = ","; } } 1316463Swnj pf(SYN); pf(ACK); pf(FIN); pf(RST); pf(URG); 1326463Swnj printf(">"); 1336463Swnj } 1346463Swnj break; 1356463Swnj 1366463Swnj case TA_USER: 137*8382Ssam timer = req >> 8; 138*8382Ssam req &= 0xff; 139*8382Ssam printf("%s", prurequests[req]); 140*8382Ssam if (req == PRU_SLOWTIMO || req == PRU_FASTTIMO) 141*8382Ssam printf("<%s>", tcptimers[timer]); 1426463Swnj break; 1436463Swnj } 1446463Swnj printf(" -> %s", tcpstates[tp->t_state]); 1456463Swnj /* print out internal state of tp !?! */ 1466463Swnj printf("\n"); 1476463Swnj if (sflag) { 1486463Swnj printf("\trcv_nxt %x rcv_wnd %d snd_una %x snd_nxt %x snd_max %x\n", 1496463Swnj tp->rcv_nxt, tp->rcv_wnd, tp->snd_una, tp->snd_nxt, tp->snd_max); 1506463Swnj printf("\tsnd_wl1 %x snd_wl2 %x snd_wnd %x\n", tp->snd_wl1, tp->snd_wl2, tp->snd_wnd); 1516463Swnj } 1526463Swnj } 1536463Swnj 1546463Swnj ptime(ms) 1556463Swnj int ms; 1566463Swnj { 1576463Swnj 1586463Swnj printf("%03d ", (ms/10) % 1000); 1596463Swnj } 160