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