|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)trpt.c 4.10 7/29/83"; ! 3: #endif ! 4: ! 5: #include <sys/param.h> ! 6: #include <sys/socket.h> ! 7: #include <sys/socketvar.h> ! 8: #define PRUREQUESTS ! 9: #include <sys/protosw.h> ! 10: ! 11: #include <net/route.h> ! 12: #include <net/if.h> ! 13: ! 14: #include <netinet/in.h> ! 15: #include <netinet/in_pcb.h> ! 16: #include <netinet/in_systm.h> ! 17: #include <netinet/ip.h> ! 18: #include <netinet/ip_var.h> ! 19: #include <netinet/tcp.h> ! 20: #define TCPSTATES ! 21: #include <netinet/tcp_fsm.h> ! 22: #include <netinet/tcp_seq.h> ! 23: #define TCPTIMERS ! 24: #include <netinet/tcp_timer.h> ! 25: #include <netinet/tcp_var.h> ! 26: #include <netinet/tcpip.h> ! 27: #define TANAMES ! 28: #include <netinet/tcp_debug.h> ! 29: ! 30: #include <stdio.h> ! 31: #include <errno.h> ! 32: #include <nlist.h> ! 33: ! 34: n_time ntime; ! 35: int sflag; ! 36: int tflag; ! 37: int jflag; ! 38: int aflag; ! 39: int numeric(); ! 40: struct nlist nl[] = { ! 41: { "_tcp_debug" }, ! 42: { "_tcp_debx" }, ! 43: 0 ! 44: }; ! 45: struct tcp_debug tcp_debug[TCP_NDEBUG]; ! 46: caddr_t tcp_pcbs[TCP_NDEBUG]; ! 47: int tcp_debx; ! 48: char *ntoa(); ! 49: ! 50: main(argc, argv) ! 51: int argc; ! 52: char **argv; ! 53: { ! 54: int i, mask = 0, npcbs = 0; ! 55: char *system = "/vmunix", *core = "/dev/kmem"; ! 56: ! 57: argc--, argv++; ! 58: again: ! 59: if (argc > 0 && !strcmp(*argv, "-a")) { ! 60: aflag++, argc--, argv++; ! 61: goto again; ! 62: } ! 63: if (argc > 0 && !strcmp(*argv, "-s")) { ! 64: sflag++, argc--, argv++; ! 65: goto again; ! 66: } ! 67: if (argc > 0 && !strcmp(*argv, "-t")) { ! 68: tflag++, argc--, argv++; ! 69: goto again; ! 70: } ! 71: if (argc > 0 && !strcmp(*argv, "-j")) { ! 72: jflag++, argc--, argv++; ! 73: goto again; ! 74: } ! 75: if (argc > 0 && !strcmp(*argv, "-p")) { ! 76: argc--, argv++; ! 77: if (argc < 1) { ! 78: fprintf(stderr, "-p: missing tcpcb address\n"); ! 79: exit(1); ! 80: } ! 81: if (npcbs >= TCP_NDEBUG) { ! 82: fprintf(stderr, "-p: too many pcb's specified\n"); ! 83: exit(1); ! 84: } ! 85: sscanf(*argv, "%x", &tcp_pcbs[npcbs++]); ! 86: argc--, argv++; ! 87: goto again; ! 88: } ! 89: if (argc > 0) { ! 90: system = *argv; ! 91: argc--, argv++; ! 92: mask++; ! 93: } ! 94: if (argc > 0) { ! 95: core = *argv; ! 96: argc--, argv++; ! 97: mask++; ! 98: } ! 99: (void) nlist(system, nl); ! 100: if (nl[0].n_value == 0) { ! 101: fprintf(stderr, "trpt: %s: no namelist\n", system); ! 102: exit(1); ! 103: } ! 104: (void) close(0); ! 105: if (open(core, 0) < 0) { ! 106: fprintf(stderr, "trpt: "); perror(core); ! 107: exit(2); ! 108: } ! 109: if (mask) { ! 110: nl[0].n_value &= 0x7fffffff; ! 111: nl[1].n_value &= 0x7fffffff; ! 112: } ! 113: (void) lseek(0, nl[1].n_value, 0); ! 114: if (read(0, &tcp_debx, sizeof (tcp_debx)) != sizeof (tcp_debx)) { ! 115: fprintf(stderr, "trpt: "); perror("tcp_debx"); ! 116: exit(3); ! 117: } ! 118: printf("tcp_debx=%d\n", tcp_debx); ! 119: (void) lseek(0, nl[0].n_value, 0); ! 120: if (read(0, tcp_debug, sizeof (tcp_debug)) != sizeof (tcp_debug)) { ! 121: fprintf(stderr, "trpt: "); perror("tcp_debug"); ! 122: exit(3); ! 123: } ! 124: /* ! 125: * If no control blocks have been specified, figure ! 126: * out how many distinct one we have and summarize ! 127: * them in tcp_pcbs for sorting the trace records ! 128: * below. ! 129: */ ! 130: if (npcbs == 0) { ! 131: for (i = 0; i < TCP_NDEBUG; i++) { ! 132: register int j; ! 133: register struct tcp_debug *td = &tcp_debug[i]; ! 134: ! 135: if (td->td_tcb == 0) ! 136: continue; ! 137: for (j = 0; j < npcbs; j++) ! 138: if (tcp_pcbs[j] == td->td_tcb) ! 139: break; ! 140: if (j >= npcbs) ! 141: tcp_pcbs[npcbs++] = td->td_tcb; ! 142: } ! 143: } ! 144: qsort(tcp_pcbs, npcbs, sizeof (caddr_t), numeric); ! 145: if (jflag) { ! 146: char *cp = ""; ! 147: ! 148: for (i = 0; i < npcbs; i++) { ! 149: printf("%s%x", cp, tcp_pcbs[i]); ! 150: cp = ", "; ! 151: } ! 152: if (*cp) ! 153: putchar('\n'); ! 154: exit(0); ! 155: } ! 156: for (i = 0; i < npcbs; i++) { ! 157: printf("\n%x:\n", tcp_pcbs[i]); ! 158: dotrace(tcp_pcbs[i]); ! 159: } ! 160: exit(0); ! 161: } ! 162: ! 163: dotrace(tcpcb) ! 164: register caddr_t tcpcb; ! 165: { ! 166: register int i; ! 167: register struct tcp_debug *td; ! 168: ! 169: for (i = 0; i < tcp_debx % TCP_NDEBUG; i++) { ! 170: td = &tcp_debug[i]; ! 171: if (tcpcb && td->td_tcb != tcpcb) ! 172: continue; ! 173: ntime = ntohl(td->td_time); ! 174: tcp_trace(td->td_act, td->td_ostate, td->td_tcb, &td->td_cb, ! 175: &td->td_ti, td->td_req); ! 176: } ! 177: for (i = tcp_debx % TCP_NDEBUG; i < TCP_NDEBUG; i++) { ! 178: td = &tcp_debug[i]; ! 179: if (tcpcb && td->td_tcb != tcpcb) ! 180: continue; ! 181: ntime = ntohl(td->td_time); ! 182: tcp_trace(td->td_act, td->td_ostate, td->td_tcb, &td->td_cb, ! 183: &td->td_ti, td->td_req); ! 184: } ! 185: } ! 186: ! 187: /* ! 188: * Tcp debug routines ! 189: */ ! 190: tcp_trace(act, ostate, atp, tp, ti, req) ! 191: short act, ostate; ! 192: struct tcpcb *atp, *tp; ! 193: struct tcpiphdr *ti; ! 194: int req; ! 195: { ! 196: tcp_seq seq, ack; ! 197: int len, flags, win, timer; ! 198: char *cp; ! 199: ! 200: ptime(ntime); ! 201: printf("%s:%s ", tcpstates[ostate], tanames[act]); ! 202: switch (act) { ! 203: ! 204: case TA_INPUT: ! 205: case TA_OUTPUT: ! 206: case TA_DROP: ! 207: if (aflag) { ! 208: printf("(src=%s,%d, ", ntoa(ti->ti_src), ! 209: ntohs(ti->ti_sport)); ! 210: printf("dst=%s,%d)", ntoa(ti->ti_dst), ! 211: ntohs(ti->ti_dport)); ! 212: } ! 213: seq = ti->ti_seq; ! 214: ack = ti->ti_ack; ! 215: len = ti->ti_len; ! 216: win = ti->ti_win; ! 217: if (act == TA_OUTPUT) { ! 218: seq = ntohl(seq); ! 219: ack = ntohl(ack); ! 220: len = ntohs(len); ! 221: win = ntohs(win); ! 222: } ! 223: if (act == TA_OUTPUT) ! 224: len -= sizeof (struct tcphdr); ! 225: if (len) ! 226: printf("[%x..%x)", seq, seq+len); ! 227: else ! 228: printf("%x", seq); ! 229: printf("@%x", ack); ! 230: if (win) ! 231: printf("(win=%x)", win); ! 232: flags = ti->ti_flags; ! 233: if (flags) { ! 234: char *cp = "<"; ! 235: #define pf(f) { if (ti->ti_flags&TH_/**/f) { printf("%s%s", cp, "f"); cp = ","; } } ! 236: pf(SYN); pf(ACK); pf(FIN); pf(RST); pf(PUSH); pf(URG); ! 237: printf(">"); ! 238: } ! 239: break; ! 240: ! 241: case TA_USER: ! 242: timer = req >> 8; ! 243: req &= 0xff; ! 244: printf("%s", prurequests[req]); ! 245: if (req == PRU_SLOWTIMO || req == PRU_FASTTIMO) ! 246: printf("<%s>", tcptimers[timer]); ! 247: break; ! 248: } ! 249: printf(" -> %s", tcpstates[tp->t_state]); ! 250: /* print out internal state of tp !?! */ ! 251: printf("\n"); ! 252: if (sflag) { ! 253: printf("\trcv_nxt %x rcv_wnd %x snd_una %x snd_nxt %x snd_max %x\n", ! 254: tp->rcv_nxt, tp->rcv_wnd, tp->snd_una, tp->snd_nxt, ! 255: tp->snd_max); ! 256: printf("\tsnd_wl1 %x snd_wl2 %x snd_wnd %x\n", tp->snd_wl1, ! 257: tp->snd_wl2, tp->snd_wnd); ! 258: } ! 259: /* print out timers? */ ! 260: if (tflag) { ! 261: char *cp = "\t"; ! 262: register int i; ! 263: ! 264: for (i = 0; i < TCPT_NTIMERS; i++) { ! 265: if (tp->t_timer[i] == 0) ! 266: continue; ! 267: printf("%s%s=%d", cp, tcptimers[i], tp->t_timer[i]); ! 268: if (i == TCPT_REXMT) ! 269: printf(" (t_rxtshft=%d)", tp->t_rxtshift); ! 270: cp = ", "; ! 271: } ! 272: if (*cp != '\t') ! 273: putchar('\n'); ! 274: } ! 275: } ! 276: ! 277: ptime(ms) ! 278: int ms; ! 279: { ! 280: ! 281: printf("%03d ", (ms/10) % 1000); ! 282: } ! 283: ! 284: numeric(c1, c2) ! 285: caddr_t *c1, *c2; ! 286: { ! 287: ! 288: return (*c1 - *c2); ! 289: } ! 290: ! 291: /* ! 292: * Convert network-format internet address ! 293: * to base 256 d.d.d.d representation. ! 294: */ ! 295: char * ! 296: ntoa(in) ! 297: struct in_addr in; ! 298: { ! 299: static char b[18]; ! 300: register char *p; ! 301: ! 302: in.s_addr = ntohl(in.s_addr); ! 303: p = (char *)∈ ! 304: #define UC(b) (((int)b)&0xff) ! 305: sprintf(b, "%d.%d.%d.%d", UC(p[0]), UC(p[1]), UC(p[2]), UC(p[3])); ! 306: return (b); ! 307: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.