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