125117Ssklower /* 225117Ssklower * Copyright (c) 1985 Regents of the University of California. 334940Sbostic * All rights reserved. 434940Sbostic * 5*42829Sbostic * %sccs.include.redist.c% 625117Ssklower */ 725117Ssklower 825117Ssklower #ifndef lint 925117Ssklower char copyright[] = 1034940Sbostic "@(#) Copyright (c) 1985 Regents of the University of California.\n\ 1125117Ssklower All rights reserved.\n"; 1234940Sbostic #endif /* not lint */ 1325117Ssklower 1425117Ssklower #ifndef lint 15*42829Sbostic static char sccsid[] = "@(#)trsp.c 6.7 (Berkeley) 06/01/90"; 1634940Sbostic #endif /* not lint */ 1725117Ssklower 1825117Ssklower #include <sys/param.h> 1925117Ssklower #include <sys/socket.h> 2025117Ssklower #include <sys/socketvar.h> 2125117Ssklower #define PRUREQUESTS 2225117Ssklower #include <sys/protosw.h> 2325117Ssklower 2425117Ssklower #include <net/route.h> 2525117Ssklower #include <net/if.h> 2625117Ssklower 2725117Ssklower #define TCPSTATES 2825117Ssklower #include <netinet/tcp_fsm.h> 2925117Ssklower #define TCPTIMERS 3025117Ssklower #include <netinet/tcp_timer.h> 3125117Ssklower 3225117Ssklower #include <netns/ns.h> 3325117Ssklower #include <netns/ns_pcb.h> 3425117Ssklower #include <netns/idp.h> 3525117Ssklower #include <netns/idp_var.h> 3625117Ssklower #include <netns/sp.h> 3725117Ssklower #include <netns/spidp.h> 3835616Sbostic #include <netns/spp_timer.h> 3925117Ssklower #include <netns/spp_var.h> 4025117Ssklower #define SANAMES 4125117Ssklower #include <netns/spp_debug.h> 4225117Ssklower 4325117Ssklower #include <stdio.h> 4425117Ssklower #include <errno.h> 4525117Ssklower #include <nlist.h> 4637985Sbostic #include <paths.h> 4725117Ssklower 4825117Ssklower unsigned long ntime; 4925117Ssklower int sflag; 5025117Ssklower int tflag; 5125117Ssklower int jflag; 5225117Ssklower int aflag; 5325117Ssklower int zflag; 5425117Ssklower int numeric(); 5525117Ssklower struct nlist nl[] = { 5625117Ssklower { "_spp_debug" }, 5725117Ssklower { "_spp_debx" }, 5825117Ssklower 0 5925117Ssklower }; 6025117Ssklower struct spp_debug spp_debug[SPP_NDEBUG]; 6125117Ssklower caddr_t spp_pcbs[SPP_NDEBUG]; 6225117Ssklower int spp_debx; 6325117Ssklower 6425117Ssklower main(argc, argv) 6525117Ssklower int argc; 6625117Ssklower char **argv; 6725117Ssklower { 6825117Ssklower int i, mask = 0, npcbs = 0; 6937309Sbostic char *system, *core; 7025117Ssklower 7137309Sbostic system = _PATH_UNIX; 7237309Sbostic core = _PATH_KMEM; 7337309Sbostic 7425117Ssklower argc--, argv++; 7525117Ssklower again: 7625117Ssklower if (argc > 0 && !strcmp(*argv, "-a")) { 7725117Ssklower aflag++, argc--, argv++; 7825117Ssklower goto again; 7925117Ssklower } 8025117Ssklower if (argc > 0 && !strcmp(*argv, "-z")) { 8125117Ssklower zflag++, argc--, argv++; 8225117Ssklower goto again; 8325117Ssklower } 8425117Ssklower if (argc > 0 && !strcmp(*argv, "-s")) { 8525117Ssklower sflag++, argc--, argv++; 8625117Ssklower goto again; 8725117Ssklower } 8825117Ssklower if (argc > 0 && !strcmp(*argv, "-t")) { 8925117Ssklower tflag++, argc--, argv++; 9025117Ssklower goto again; 9125117Ssklower } 9225117Ssklower if (argc > 0 && !strcmp(*argv, "-j")) { 9325117Ssklower jflag++, argc--, argv++; 9425117Ssklower goto again; 9525117Ssklower } 9625117Ssklower if (argc > 0 && !strcmp(*argv, "-p")) { 9725117Ssklower argc--, argv++; 9825117Ssklower if (argc < 1) { 9925117Ssklower fprintf(stderr, "-p: missing sppcb address\n"); 10025117Ssklower exit(1); 10125117Ssklower } 10225117Ssklower if (npcbs >= SPP_NDEBUG) { 10325117Ssklower fprintf(stderr, "-p: too many pcb's specified\n"); 10425117Ssklower exit(1); 10525117Ssklower } 10625117Ssklower sscanf(*argv, "%x", &spp_pcbs[npcbs++]); 10725117Ssklower argc--, argv++; 10825117Ssklower goto again; 10925117Ssklower } 11025117Ssklower if (argc > 0) { 11125117Ssklower system = *argv; 11225117Ssklower argc--, argv++; 11325117Ssklower mask++; 11425117Ssklower } 11525117Ssklower if (argc > 0) { 11625117Ssklower core = *argv; 11725117Ssklower argc--, argv++; 11825117Ssklower mask++; 11925117Ssklower } 12025117Ssklower (void) nlist(system, nl); 12125117Ssklower if (nl[0].n_value == 0) { 12225117Ssklower fprintf(stderr, "trsp: %s: no namelist\n", system); 12325117Ssklower exit(1); 12425117Ssklower } 12525117Ssklower (void) close(0); 12625117Ssklower if (open(core, 0) < 0) { 12725117Ssklower fprintf(stderr, "trsp: "); perror(core); 12825117Ssklower exit(2); 12925117Ssklower } 13025117Ssklower if (mask) { 13125117Ssklower nl[0].n_value &= 0x7fffffff; 13225117Ssklower nl[1].n_value &= 0x7fffffff; 13325117Ssklower } 13425117Ssklower (void) lseek(0, nl[1].n_value, 0); 13525117Ssklower if (read(0, &spp_debx, sizeof (spp_debx)) != sizeof (spp_debx)) { 13625117Ssklower fprintf(stderr, "trsp: "); perror("spp_debx"); 13725117Ssklower exit(3); 13825117Ssklower } 13925117Ssklower printf("spp_debx=%d\n", spp_debx); 14025117Ssklower (void) lseek(0, nl[0].n_value, 0); 14125117Ssklower if (read(0, spp_debug, sizeof (spp_debug)) != sizeof (spp_debug)) { 14225117Ssklower fprintf(stderr, "trsp: "); perror("spp_debug"); 14325117Ssklower exit(3); 14425117Ssklower } 14525117Ssklower /* 14625117Ssklower * Here, we just want to clear out the old trace data and start over. 14725117Ssklower */ 14825117Ssklower if (zflag) { 14925117Ssklower char *cp = (char *) spp_debug, 15025117Ssklower *cplim = cp + sizeof(spp_debug); 15125117Ssklower (void) close(0); 15225117Ssklower if (open(core, 2) < 0) { 15325117Ssklower fprintf(stderr, "trsp: "); perror(core); 15425117Ssklower exit(2); 15525117Ssklower } 15625117Ssklower while(cp < cplim) *cp++ = 0; 15725117Ssklower (void) lseek(0, nl[0].n_value, 0); 15825117Ssklower if (write(0, spp_debug, sizeof (spp_debug)) != sizeof (spp_debug)) { 15925117Ssklower fprintf(stderr, "trsp: "); perror("spp_debug"); 16025117Ssklower exit(3); 16125117Ssklower } 16225117Ssklower (void) lseek(0, nl[1].n_value, 0); 16325117Ssklower spp_debx = 0; 16425117Ssklower if (write(0, &spp_debx, sizeof (spp_debx)) != sizeof (spp_debx)) { 16525117Ssklower fprintf(stderr, "trsp: "); perror("spp_debx"); 16625117Ssklower exit(3); 16725117Ssklower } 16825117Ssklower exit(0); 16925117Ssklower } 17025117Ssklower /* 17125117Ssklower * If no control blocks have been specified, figure 17225117Ssklower * out how many distinct one we have and summarize 17325117Ssklower * them in spp_pcbs for sorting the trace records 17425117Ssklower * below. 17525117Ssklower */ 17625117Ssklower if (npcbs == 0) { 17725117Ssklower for (i = 0; i < SPP_NDEBUG; i++) { 17825117Ssklower register int j; 17925117Ssklower register struct spp_debug *sd = &spp_debug[i]; 18025117Ssklower 18125117Ssklower if (sd->sd_cb == 0) 18225117Ssklower continue; 18325117Ssklower for (j = 0; j < npcbs; j++) 18425117Ssklower if (spp_pcbs[j] == sd->sd_cb) 18525117Ssklower break; 18625117Ssklower if (j >= npcbs) 18725117Ssklower spp_pcbs[npcbs++] = sd->sd_cb; 18825117Ssklower } 18925117Ssklower } 19025117Ssklower qsort(spp_pcbs, npcbs, sizeof (caddr_t), numeric); 19125117Ssklower if (jflag) { 19225117Ssklower char *cp = ""; 19325117Ssklower 19425117Ssklower for (i = 0; i < npcbs; i++) { 19525117Ssklower printf("%s%x", cp, spp_pcbs[i]); 19625117Ssklower cp = ", "; 19725117Ssklower } 19825117Ssklower if (*cp) 19925117Ssklower putchar('\n'); 20025117Ssklower exit(0); 20125117Ssklower } 20225117Ssklower for (i = 0; i < npcbs; i++) { 20325117Ssklower printf("\n%x:\n", spp_pcbs[i]); 20425117Ssklower dotrace(spp_pcbs[i]); 20525117Ssklower } 20625117Ssklower exit(0); 20725117Ssklower } 20825117Ssklower 20925117Ssklower dotrace(sppcb) 21025117Ssklower register caddr_t sppcb; 21125117Ssklower { 21225117Ssklower register int i; 21325117Ssklower register struct spp_debug *sd; 21425117Ssklower 21525117Ssklower for (i = spp_debx % SPP_NDEBUG; i < SPP_NDEBUG; i++) { 21625117Ssklower sd = &spp_debug[i]; 21725117Ssklower if (sppcb && sd->sd_cb != sppcb) 21825117Ssklower continue; 21925117Ssklower ntime = ntohl(sd->sd_time); 22025117Ssklower spp_trace(sd->sd_act, sd->sd_ostate, sd->sd_cb, &sd->sd_sp, 22125117Ssklower &sd->sd_si, sd->sd_req); 22225117Ssklower } 22325117Ssklower for (i = 0; i < spp_debx % SPP_NDEBUG; i++) { 22425117Ssklower sd = &spp_debug[i]; 22525117Ssklower if (sppcb && sd->sd_cb != sppcb) 22625117Ssklower continue; 22725117Ssklower ntime = ntohl(sd->sd_time); 22825117Ssklower spp_trace(sd->sd_act, sd->sd_ostate, sd->sd_cb, &sd->sd_sp, 22925117Ssklower &sd->sd_si, sd->sd_req); 23025117Ssklower } 23125117Ssklower } 23225117Ssklower 23325117Ssklower ptime(ms) 23425117Ssklower int ms; 23525117Ssklower { 23625117Ssklower 23725117Ssklower printf("%03d ", (ms/10) % 1000); 23825117Ssklower } 23925117Ssklower 24025117Ssklower numeric(c1, c2) 24125117Ssklower caddr_t *c1, *c2; 24225117Ssklower { 24325117Ssklower 24425117Ssklower return (*c1 - *c2); 24525117Ssklower } 24625117Ssklower 24725117Ssklower spp_trace(act, ostate, asp, sp, si, req) 24825117Ssklower short act, ostate; 24925117Ssklower struct sppcb *asp, *sp; 25025117Ssklower struct spidp *si; 25125117Ssklower int req; 25225117Ssklower { 25325117Ssklower u_short seq, ack, len, alo; 25425117Ssklower int flags, timer; 25525117Ssklower char *cp; 25625117Ssklower 25725117Ssklower if(ostate >= TCP_NSTATES) ostate = 0; 25825117Ssklower if(act > SA_DROP) act = SA_DROP; 25925117Ssklower printf("\n"); 26025117Ssklower ptime(ntime); 26125117Ssklower printf("%s:%s", tcpstates[ostate], sanames[act]); 26225117Ssklower 26325117Ssklower if (si != 0) { 26425117Ssklower seq = si->si_seq; 26525117Ssklower ack = si->si_ack; 26625117Ssklower alo = si->si_alo; 26725117Ssklower len = si->si_len; 26825117Ssklower switch (act) { 26925117Ssklower case SA_RESPOND: 27025117Ssklower case SA_OUTPUT: 27125117Ssklower seq = ntohs(seq); 27225117Ssklower ack = ntohs(ack); 27325117Ssklower alo = ntohs(alo); 27425117Ssklower len = ntohs(len); 27525117Ssklower case SA_INPUT: 27625117Ssklower case SA_DROP: 27725117Ssklower if (aflag) { 27825117Ssklower printf("\n\tsna="); 27925117Ssklower ns_printhost(&si->si_sna); 28025117Ssklower printf("\tdna="); 28125117Ssklower ns_printhost(&si->si_dna); 28225117Ssklower } 28325117Ssklower printf("\n\t"); 28425117Ssklower #define p1(f) { printf("%s = %x, ", "f", f); } 28525117Ssklower p1(seq); p1(ack); p1(alo); p1(len); 28625117Ssklower flags = si->si_cc; 28725117Ssklower printf("flags=%x", flags); 28825117Ssklower if (flags) { 28925117Ssklower char *cp = "<"; 29040280Sbostic #define pf(f) { if (flags&f) { printf("%s%s", cp, "f"); cp = ","; } } 29140280Sbostic pf(SP_SP); pf(SP_SA); pf(SP_OB); pf(SP_EM); 29225117Ssklower printf(">"); 29325117Ssklower } 29425117Ssklower printf(", "); 29525117Ssklower #define p2(f) { printf("%s = %x, ", "f", si->si_/**/f); } 29625117Ssklower p2(sid);p2(did);p2(dt); 29725117Ssklower printf("\n\tsna="); 29825117Ssklower ns_printhost(&si->si_sna); 29925117Ssklower printf("\tdna="); 30025117Ssklower ns_printhost(&si->si_dna); 30125117Ssklower } 30225117Ssklower } 30325117Ssklower if(act == SA_USER) { 30425117Ssklower printf("\treq=%s", prurequests[req&0xff]); 30525117Ssklower if ((req & 0xff) == PRU_SLOWTIMO) 30625117Ssklower printf("<%s>", tcptimers[req>>8]); 30725117Ssklower } 30825117Ssklower printf(" -> %s", tcpstates[sp->s_state]); 30925117Ssklower 31025117Ssklower /* print out internal state of sp !?! */ 31125117Ssklower printf("\n"); 31225117Ssklower if (sp == 0) 31325117Ssklower return; 31425117Ssklower #define p3(f) { printf("%s = %x, ", "f", sp->s_/**/f); } 31525117Ssklower if(sflag) { 31635616Sbostic printf("\t"); p3(rack); p3(ralo); p3(smax); p3(snxt); p3(flags); 31725117Ssklower #undef pf 31825117Ssklower #define pf(f) { if (flags&SF_/**/f) { printf("%s%s", cp, "f"); cp = ","; } } 31925117Ssklower flags = sp->s_flags; 32025117Ssklower if (flags || sp->s_oobflags) { 32125117Ssklower char *cp = "<"; 32235616Sbostic pf(ACKNOW); pf(DELACK); pf(HI); pf(HO); 32335616Sbostic pf(PI); pf(WIN); pf(RXT); pf(RVD); 32425117Ssklower flags = sp->s_oobflags; 32525117Ssklower pf(SOOB); pf(IOOB); 32625117Ssklower printf(">"); 32725117Ssklower } 32825117Ssklower 32925117Ssklower } 33025117Ssklower /* print out timers? */ 33125117Ssklower if (tflag) { 33225117Ssklower char *cp = "\t"; 33325117Ssklower register int i; 33425117Ssklower 33525117Ssklower printf("\n\tTIMERS: "); 33625117Ssklower p3(idle); p3(force); p3(rtseq); 33725117Ssklower for (i = 0; i < TCPT_NTIMERS; i++) { 33825117Ssklower if (sp->s_timer[i] == 0) 33925117Ssklower continue; 34025117Ssklower printf("%s%s=%d", cp, tcptimers[i], sp->s_timer[i]); 34125117Ssklower if (i == TCPT_REXMT) 34225117Ssklower printf(" (s_rxtshft=%d)", sp->s_rxtshift); 34325117Ssklower cp = ", "; 34425117Ssklower } 34525117Ssklower if (*cp != '\t') 34625117Ssklower putchar('\n'); 34725117Ssklower } 34825117Ssklower } 34925117Ssklower 35025117Ssklower ns_printhost(p) 35125117Ssklower register struct ns_addr *p; 35225117Ssklower { 35325117Ssklower 35425117Ssklower printf("<net:%x%x,host:%4.4x%4.4x%4.4x,port:%x>", 35525117Ssklower p->x_net.s_net[0], 35625117Ssklower p->x_net.s_net[1], 35725117Ssklower p->x_host.s_host[0], 35825117Ssklower p->x_host.s_host[1], 35925117Ssklower p->x_host.s_host[2], 36025117Ssklower p->x_port); 36125117Ssklower 36225117Ssklower } 36325117Ssklower 364