|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1985 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #ifndef lint ! 8: char copyright[] = ! 9: "@(#) Copyright (c) 1980 Regents of the University of California.\n\ ! 10: All rights reserved.\n"; ! 11: #endif not lint ! 12: ! 13: #ifndef lint ! 14: static char sccsid[] = "@(#)trsp.c 6.1 (Berkeley) 10/8/85"; ! 15: #endif not lint ! 16: ! 17: #include <sys/param.h> ! 18: #include <sys/socket.h> ! 19: #include <sys/socketvar.h> ! 20: #define PRUREQUESTS ! 21: #include <sys/protosw.h> ! 22: ! 23: #include <net/route.h> ! 24: #include <net/if.h> ! 25: ! 26: #define TCPSTATES ! 27: #include <netinet/tcp_fsm.h> ! 28: #define TCPTIMERS ! 29: #include <netinet/tcp_timer.h> ! 30: ! 31: #include <netns/ns.h> ! 32: #include <netns/ns_pcb.h> ! 33: #include <netns/idp.h> ! 34: #include <netns/idp_var.h> ! 35: #include <netns/sp.h> ! 36: #include <netns/spidp.h> ! 37: #include <netns/spp_var.h> ! 38: #define SANAMES ! 39: #include <netns/spp_debug.h> ! 40: ! 41: #include <stdio.h> ! 42: #include <errno.h> ! 43: #include <nlist.h> ! 44: ! 45: unsigned long ntime; ! 46: int sflag; ! 47: int tflag; ! 48: int jflag; ! 49: int aflag; ! 50: int zflag; ! 51: int numeric(); ! 52: struct nlist nl[] = { ! 53: { "_spp_debug" }, ! 54: { "_spp_debx" }, ! 55: 0 ! 56: }; ! 57: struct spp_debug spp_debug[SPP_NDEBUG]; ! 58: caddr_t spp_pcbs[SPP_NDEBUG]; ! 59: int spp_debx; ! 60: ! 61: main(argc, argv) ! 62: int argc; ! 63: char **argv; ! 64: { ! 65: int i, mask = 0, npcbs = 0; ! 66: char *system = "/vmunix", *core = "/dev/kmem"; ! 67: ! 68: argc--, argv++; ! 69: again: ! 70: if (argc > 0 && !strcmp(*argv, "-a")) { ! 71: aflag++, argc--, argv++; ! 72: goto again; ! 73: } ! 74: if (argc > 0 && !strcmp(*argv, "-z")) { ! 75: zflag++, argc--, argv++; ! 76: goto again; ! 77: } ! 78: if (argc > 0 && !strcmp(*argv, "-s")) { ! 79: sflag++, argc--, argv++; ! 80: goto again; ! 81: } ! 82: if (argc > 0 && !strcmp(*argv, "-t")) { ! 83: tflag++, argc--, argv++; ! 84: goto again; ! 85: } ! 86: if (argc > 0 && !strcmp(*argv, "-j")) { ! 87: jflag++, argc--, argv++; ! 88: goto again; ! 89: } ! 90: if (argc > 0 && !strcmp(*argv, "-p")) { ! 91: argc--, argv++; ! 92: if (argc < 1) { ! 93: fprintf(stderr, "-p: missing sppcb address\n"); ! 94: exit(1); ! 95: } ! 96: if (npcbs >= SPP_NDEBUG) { ! 97: fprintf(stderr, "-p: too many pcb's specified\n"); ! 98: exit(1); ! 99: } ! 100: sscanf(*argv, "%x", &spp_pcbs[npcbs++]); ! 101: argc--, argv++; ! 102: goto again; ! 103: } ! 104: if (argc > 0) { ! 105: system = *argv; ! 106: argc--, argv++; ! 107: mask++; ! 108: } ! 109: if (argc > 0) { ! 110: core = *argv; ! 111: argc--, argv++; ! 112: mask++; ! 113: } ! 114: (void) nlist(system, nl); ! 115: if (nl[0].n_value == 0) { ! 116: fprintf(stderr, "trsp: %s: no namelist\n", system); ! 117: exit(1); ! 118: } ! 119: (void) close(0); ! 120: if (open(core, 0) < 0) { ! 121: fprintf(stderr, "trsp: "); perror(core); ! 122: exit(2); ! 123: } ! 124: if (mask) { ! 125: nl[0].n_value &= 0x7fffffff; ! 126: nl[1].n_value &= 0x7fffffff; ! 127: } ! 128: (void) lseek(0, nl[1].n_value, 0); ! 129: if (read(0, &spp_debx, sizeof (spp_debx)) != sizeof (spp_debx)) { ! 130: fprintf(stderr, "trsp: "); perror("spp_debx"); ! 131: exit(3); ! 132: } ! 133: printf("spp_debx=%d\n", spp_debx); ! 134: (void) lseek(0, nl[0].n_value, 0); ! 135: if (read(0, spp_debug, sizeof (spp_debug)) != sizeof (spp_debug)) { ! 136: fprintf(stderr, "trsp: "); perror("spp_debug"); ! 137: exit(3); ! 138: } ! 139: /* ! 140: * Here, we just want to clear out the old trace data and start over. ! 141: */ ! 142: if (zflag) { ! 143: char *cp = (char *) spp_debug, ! 144: *cplim = cp + sizeof(spp_debug); ! 145: (void) close(0); ! 146: if (open(core, 2) < 0) { ! 147: fprintf(stderr, "trsp: "); perror(core); ! 148: exit(2); ! 149: } ! 150: while(cp < cplim) *cp++ = 0; ! 151: (void) lseek(0, nl[0].n_value, 0); ! 152: if (write(0, spp_debug, sizeof (spp_debug)) != sizeof (spp_debug)) { ! 153: fprintf(stderr, "trsp: "); perror("spp_debug"); ! 154: exit(3); ! 155: } ! 156: (void) lseek(0, nl[1].n_value, 0); ! 157: spp_debx = 0; ! 158: if (write(0, &spp_debx, sizeof (spp_debx)) != sizeof (spp_debx)) { ! 159: fprintf(stderr, "trsp: "); perror("spp_debx"); ! 160: exit(3); ! 161: } ! 162: exit(0); ! 163: } ! 164: /* ! 165: * If no control blocks have been specified, figure ! 166: * out how many distinct one we have and summarize ! 167: * them in spp_pcbs for sorting the trace records ! 168: * below. ! 169: */ ! 170: if (npcbs == 0) { ! 171: for (i = 0; i < SPP_NDEBUG; i++) { ! 172: register int j; ! 173: register struct spp_debug *sd = &spp_debug[i]; ! 174: ! 175: if (sd->sd_cb == 0) ! 176: continue; ! 177: for (j = 0; j < npcbs; j++) ! 178: if (spp_pcbs[j] == sd->sd_cb) ! 179: break; ! 180: if (j >= npcbs) ! 181: spp_pcbs[npcbs++] = sd->sd_cb; ! 182: } ! 183: } ! 184: qsort(spp_pcbs, npcbs, sizeof (caddr_t), numeric); ! 185: if (jflag) { ! 186: char *cp = ""; ! 187: ! 188: for (i = 0; i < npcbs; i++) { ! 189: printf("%s%x", cp, spp_pcbs[i]); ! 190: cp = ", "; ! 191: } ! 192: if (*cp) ! 193: putchar('\n'); ! 194: exit(0); ! 195: } ! 196: for (i = 0; i < npcbs; i++) { ! 197: printf("\n%x:\n", spp_pcbs[i]); ! 198: dotrace(spp_pcbs[i]); ! 199: } ! 200: exit(0); ! 201: } ! 202: ! 203: dotrace(sppcb) ! 204: register caddr_t sppcb; ! 205: { ! 206: register int i; ! 207: register struct spp_debug *sd; ! 208: ! 209: for (i = spp_debx % SPP_NDEBUG; i < SPP_NDEBUG; i++) { ! 210: sd = &spp_debug[i]; ! 211: if (sppcb && sd->sd_cb != sppcb) ! 212: continue; ! 213: ntime = ntohl(sd->sd_time); ! 214: spp_trace(sd->sd_act, sd->sd_ostate, sd->sd_cb, &sd->sd_sp, ! 215: &sd->sd_si, sd->sd_req); ! 216: } ! 217: for (i = 0; i < spp_debx % SPP_NDEBUG; i++) { ! 218: sd = &spp_debug[i]; ! 219: if (sppcb && sd->sd_cb != sppcb) ! 220: continue; ! 221: ntime = ntohl(sd->sd_time); ! 222: spp_trace(sd->sd_act, sd->sd_ostate, sd->sd_cb, &sd->sd_sp, ! 223: &sd->sd_si, sd->sd_req); ! 224: } ! 225: } ! 226: ! 227: ptime(ms) ! 228: int ms; ! 229: { ! 230: ! 231: printf("%03d ", (ms/10) % 1000); ! 232: } ! 233: ! 234: numeric(c1, c2) ! 235: caddr_t *c1, *c2; ! 236: { ! 237: ! 238: return (*c1 - *c2); ! 239: } ! 240: ! 241: spp_trace(act, ostate, asp, sp, si, req) ! 242: short act, ostate; ! 243: struct sppcb *asp, *sp; ! 244: struct spidp *si; ! 245: int req; ! 246: { ! 247: u_short seq, ack, len, alo; ! 248: int flags, timer; ! 249: char *cp; ! 250: ! 251: if(ostate >= TCP_NSTATES) ostate = 0; ! 252: if(act > SA_DROP) act = SA_DROP; ! 253: printf("\n"); ! 254: ptime(ntime); ! 255: printf("%s:%s", tcpstates[ostate], sanames[act]); ! 256: ! 257: if (si != 0) { ! 258: seq = si->si_seq; ! 259: ack = si->si_ack; ! 260: alo = si->si_alo; ! 261: len = si->si_len; ! 262: switch (act) { ! 263: case SA_RESPOND: ! 264: case SA_OUTPUT: ! 265: seq = ntohs(seq); ! 266: ack = ntohs(ack); ! 267: alo = ntohs(alo); ! 268: len = ntohs(len); ! 269: case SA_INPUT: ! 270: case SA_DROP: ! 271: if (aflag) { ! 272: printf("\n\tsna="); ! 273: ns_printhost(&si->si_sna); ! 274: printf("\tdna="); ! 275: ns_printhost(&si->si_dna); ! 276: } ! 277: printf("\n\t"); ! 278: #define p1(f) { printf("%s = %x, ", "f", f); } ! 279: p1(seq); p1(ack); p1(alo); p1(len); ! 280: flags = si->si_cc; ! 281: printf("flags=%x", flags); ! 282: if (flags) { ! 283: char *cp = "<"; ! 284: #define pf(f) { if (flags&SP_/**/f) { printf("%s%s", cp, "f"); cp = ","; } } ! 285: pf(SP); pf(SA); pf(OB); pf(EM); ! 286: printf(">"); ! 287: } ! 288: printf(", "); ! 289: #define p2(f) { printf("%s = %x, ", "f", si->si_/**/f); } ! 290: p2(sid);p2(did);p2(dt); ! 291: printf("\n\tsna="); ! 292: ns_printhost(&si->si_sna); ! 293: printf("\tdna="); ! 294: ns_printhost(&si->si_dna); ! 295: } ! 296: } ! 297: if(act == SA_USER) { ! 298: printf("\treq=%s", prurequests[req&0xff]); ! 299: if ((req & 0xff) == PRU_SLOWTIMO) ! 300: printf("<%s>", tcptimers[req>>8]); ! 301: } ! 302: printf(" -> %s", tcpstates[sp->s_state]); ! 303: ! 304: /* print out internal state of sp !?! */ ! 305: printf("\n"); ! 306: if (sp == 0) ! 307: return; ! 308: #define p3(f) { printf("%s = %x, ", "f", sp->s_/**/f); } ! 309: if(sflag) { ! 310: printf("\t"); p3(rack); p3(ralo); p3(snt); p3(flags); ! 311: #undef pf ! 312: #define pf(f) { if (flags&SF_/**/f) { printf("%s%s", cp, "f"); cp = ","; } } ! 313: flags = sp->s_flags; ! 314: if (flags || sp->s_oobflags) { ! 315: char *cp = "<"; ! 316: pf(AK); pf(DELACK); pf(HI); pf(HO); ! 317: flags = sp->s_oobflags; ! 318: pf(SOOB); pf(IOOB); ! 319: printf(">"); ! 320: } ! 321: ! 322: } ! 323: /* print out timers? */ ! 324: if (tflag) { ! 325: char *cp = "\t"; ! 326: register int i; ! 327: ! 328: printf("\n\tTIMERS: "); ! 329: p3(idle); p3(force); p3(rtseq); ! 330: for (i = 0; i < TCPT_NTIMERS; i++) { ! 331: if (sp->s_timer[i] == 0) ! 332: continue; ! 333: printf("%s%s=%d", cp, tcptimers[i], sp->s_timer[i]); ! 334: if (i == TCPT_REXMT) ! 335: printf(" (s_rxtshft=%d)", sp->s_rxtshift); ! 336: cp = ", "; ! 337: } ! 338: if (*cp != '\t') ! 339: putchar('\n'); ! 340: } ! 341: } ! 342: ! 343: ns_printhost(p) ! 344: register struct ns_addr *p; ! 345: { ! 346: ! 347: printf("<net:%x%x,host:%4.4x%4.4x%4.4x,port:%x>", ! 348: p->x_net.s_net[0], ! 349: p->x_net.s_net[1], ! 350: p->x_host.s_host[0], ! 351: p->x_host.s_host[1], ! 352: p->x_host.s_host[2], ! 353: p->x_port); ! 354: ! 355: } ! 356:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.