|
|
1.1 ! root 1: /*- ! 2: * Copyright (c) 1988, 1991 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms, with or without ! 6: * modification, are permitted provided that the following conditions ! 7: * are met: ! 8: * 1. Redistributions of source code must retain the above copyright ! 9: * notice, this list of conditions and the following disclaimer. ! 10: * 2. Redistributions in binary form must reproduce the above copyright ! 11: * notice, this list of conditions and the following disclaimer in the ! 12: * documentation and/or other materials provided with the distribution. ! 13: * 3. All advertising materials mentioning features or use of this software ! 14: * must display the following acknowledgement: ! 15: * This product includes software developed by the University of ! 16: * California, Berkeley and its contributors. ! 17: * 4. Neither the name of the University nor the names of its contributors ! 18: * may be used to endorse or promote products derived from this software ! 19: * without specific prior written permission. ! 20: * ! 21: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ! 22: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ! 23: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ! 24: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ! 25: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ! 26: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ! 27: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ! 28: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ! 29: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ! 30: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ! 31: * SUCH DAMAGE. ! 32: */ ! 33: ! 34: #ifndef lint ! 35: char copyright[] = ! 36: "@(#) Copyright (c) 1988, 1991 The Regents of the University of California.\n\ ! 37: All rights reserved.\n"; ! 38: #endif /* not lint */ ! 39: ! 40: #ifndef lint ! 41: static char sccsid[] = "@(#)pk_dump.c 7.2 (Berkeley) 5/9/91"; ! 42: #endif /* not lint */ ! 43: ! 44: /* ! 45: * This is a kernel debugging aid. ! 46: * dumps out a cache of mbufs. ! 47: */ ! 48: ! 49: #include <sys/param.h> ! 50: #include <sys/mbuf.h> ! 51: #include <sys/socket.h> ! 52: #include <sys/socketvar.h> ! 53: #include <net/if.h> ! 54: #include <netccitt/x25.h> ! 55: #include <netccitt/pk.h> ! 56: #include <netccitt/pk_var.h> ! 57: ! 58: #include <errno.h> ! 59: #include <netdb.h> ! 60: #include <nlist.h> ! 61: #include <kvm.h> ! 62: #include <paths.h> ! 63: #include <stdio.h> ! 64: /* ! 65: * This procedure decodes the X.25 level 3 packet returning a ! 66: * code to be used in switchs or arrays. ! 67: */ ! 68: ! 69: pk_decode (xp) ! 70: register struct x25_packet *xp; ! 71: { ! 72: register int type; ! 73: ! 74: if (xp -> fmt_identifier != 1) ! 75: return (INVALID_PACKET); ! 76: #ifdef ancient_history ! 77: /* ! 78: * Make sure that the logical channel group number is 0. ! 79: * This restriction may be removed at some later date. ! 80: */ ! 81: if (xp -> lc_group_number != 0) ! 82: return (INVALID_PACKET); ! 83: #endif ! 84: /* ! 85: * Test for data packet first. ! 86: */ ! 87: if (!(xp -> packet_type & DATA_PACKET_DESIGNATOR)) ! 88: return (DATA); ! 89: ! 90: /* ! 91: * Test if flow control packet (RR or RNR). ! 92: */ ! 93: if (!(xp -> packet_type & RR_OR_RNR_PACKET_DESIGNATOR)) ! 94: switch (xp -> packet_type & 0x1f) { ! 95: case X25_RR: ! 96: return (RR); ! 97: case X25_RNR: ! 98: return (RNR); ! 99: case X25_REJECT: ! 100: return (REJECT); ! 101: } ! 102: ! 103: /* ! 104: * Determine the rest of the packet types. ! 105: */ ! 106: switch (xp -> packet_type) { ! 107: case X25_CALL: ! 108: type = CALL; ! 109: break; ! 110: ! 111: case X25_CALL_ACCEPTED: ! 112: type = CALL_ACCEPTED; ! 113: break; ! 114: ! 115: case X25_CLEAR: ! 116: type = CLEAR; ! 117: break; ! 118: ! 119: case X25_CLEAR_CONFIRM: ! 120: type = CLEAR_CONF; ! 121: break; ! 122: ! 123: case X25_INTERRUPT: ! 124: type = INTERRUPT; ! 125: break; ! 126: ! 127: case X25_INTERRUPT_CONFIRM: ! 128: type = INTERRUPT_CONF; ! 129: break; ! 130: ! 131: case X25_RESET: ! 132: type = RESET; ! 133: break; ! 134: ! 135: case X25_RESET_CONFIRM: ! 136: type = RESET_CONF; ! 137: break; ! 138: ! 139: case X25_RESTART: ! 140: type = RESTART; ! 141: break; ! 142: ! 143: case X25_RESTART_CONFIRM: ! 144: type = RESTART_CONF; ! 145: break; ! 146: ! 147: case X25_DIAGNOSTIC: ! 148: type = DIAG_TYPE; ! 149: break; ! 150: ! 151: default: ! 152: type = INVALID_PACKET; ! 153: } ! 154: return (type); ! 155: } ! 156: ! 157: char *pk_state[] = { ! 158: "Listen", "Ready", "Received-Call", ! 159: "Sent-Call", "Data-Transfer","Received-Clear", ! 160: "Sent-Clear", ! 161: }; ! 162: ! 163: char *pk_name[] = { ! 164: "Call", "Call-Conf", "Clear", ! 165: "Clear-Conf", "Data", "Intr", "Intr-Conf", ! 166: "Rr", "Rnr", "Reset", "Reset-Conf", ! 167: "Restart", "Restart-Conf", "Reject", "Diagnostic", ! 168: "Invalid" ! 169: }; ! 170: ! 171: int pk_lengths[] = {0, 0, 0, ! 172: 0, 3, 5, 3, ! 173: 3, 3, 5, 5, ! 174: 5, 5, 5, 0, ! 175: 0, 0}; ! 176: ! 177: pk_trace (m, dir) ! 178: register struct mbuf *m; ! 179: char *dir; ! 180: { ! 181: register char *s; ! 182: struct x25_packet *xp = mtod(m, struct x25_packet *); ! 183: register int i, len = 0, cnt = 0; ! 184: ! 185: i = pk_decode (xp) / MAXSTATES; ! 186: if ((len = pk_lengths[i]) || (len = m -> m_len)) ! 187: if (len > 5) ! 188: len = 5; ! 189: ! 190: printf ("%s LCN=%d: %s (", dir, LCN(xp), pk_name[i]); ! 191: ! 192: for (s = (char *) xp, i = 0; i < len; ++i, ++s) ! 193: printf ("%x ", (int) * s & 0xff); ! 194: printf (")\n"); ! 195: } ! 196: ! 197: bprintf(fp, b, s) ! 198: register FILE *fp; ! 199: register int b; ! 200: register u_char *s; ! 201: { ! 202: register int i; ! 203: int gotsome = 0; ! 204: ! 205: if (b == 0) ! 206: return; ! 207: while (i = *s++) { ! 208: if (b & (1 << (i-1))) { ! 209: if (gotsome == 0) ! 210: i = '<'; ! 211: else ! 212: i = ','; ! 213: (void) putc(i, fp); ! 214: gotsome = 1; ! 215: for (; (i = *s) > 32; s++) ! 216: (void) putc(i, fp); ! 217: } else ! 218: while (*s > 32) ! 219: s++; ! 220: } ! 221: if (gotsome) ! 222: (void) putc('>', fp); ! 223: } ! 224: ! 225: int verbose = 0; /* so you can adb -w the binary */ ! 226: int tflag = 0; ! 227: int Iflag = 0; ! 228: int Aflag = 0; ! 229: char *vmunix = _PATH_UNIX; ! 230: char *kmemf; ! 231: struct nlist nl[] = { ! 232: {"_pk_output_cache"}, ! 233: {"_pk_input_cache"}, ! 234: 0 ! 235: }; ! 236: ! 237: main(argc, argv) ! 238: int argc; ! 239: char **argv; ! 240: { ! 241: ! 242: if (kvm_openfiles(vmunix, kmemf, NULL) == -1) { ! 243: fprintf(stderr, "netstat: kvm_openfiles: %s\n", kvm_geterr()); ! 244: exit(1); ! 245: } ! 246: if (kvm_nlist(nl) < 0 || nl[0].n_type == 0) { ! 247: fprintf(stderr, "%s: no namelist\n", vmunix); ! 248: exit(1); ! 249: } ! 250: mbuf_cache_dump(nl); ! 251: mbuf_cache_dump(nl + 1); ! 252: } ! 253: struct mbuf_cache c; ! 254: struct mbuf **mbvec; ! 255: #define kget(p, d) \ ! 256: (kvm_read((void *)(p), &(d), sizeof (d))) ! 257: ! 258: mbuf_cache_dump(nl) ! 259: struct nlist *nl; ! 260: { ! 261: register struct mbuf *m; ! 262: unsigned cache_size; ! 263: int i; ! 264: ! 265: printf("Dumping %s:\n", nl->n_name); ! 266: kget(nl->n_value, c); ! 267: if (cache_size = c.mbc_size * sizeof(m)) ! 268: mbvec = (struct mbuf **)malloc(cache_size); ! 269: if (mbvec == 0 || c.mbc_cache == 0) ! 270: return; ! 271: kvm_read(c.mbc_cache, mbvec, cache_size); ! 272: for (i = c.mbc_num;;) { ! 273: if (i == 0) ! 274: i = c.mbc_size; ! 275: i--; ! 276: if (m = mbvec[i]) ! 277: mbuf_dump(m); ! 278: if (i == c.mbc_num) ! 279: break; ! 280: } ! 281: } ! 282: ! 283: ! 284: mbuf_dump(m) ! 285: register struct mbuf *m; ! 286: { ! 287: int virgin = 1; ! 288: register struct x25_packet *xp; ! 289: struct mbuf n; ! 290: char extbuf[1024]; ! 291: ! 292: putchar('\n'); ! 293: for (; m; m = n.m_next) { ! 294: kget(m, n); ! 295: printf("m %x", m); ! 296: if (n.m_flags) { ! 297: printf(" flags "); ! 298: bprintf(stdout, n.m_flags, ! 299: "\1M_EXT\2M_PKTHDR\3M_EOR\4M_BCAST\5M_MCAST"); ! 300: } ! 301: if (Aflag) ! 302: printf(" chained %x", n.m_nextpkt); ! 303: printf(" next %x len %d", n.m_next, n.m_len); ! 304: if (n.m_flags & M_PKTHDR) { ! 305: printf(" total %d", n.m_pkthdr.len); ! 306: if (Iflag) ! 307: printf(" rcvif %x", n.m_pkthdr.rcvif); ! 308: } ! 309: putchar('\n'); ! 310: if (n.m_flags & M_EXT) { ! 311: kvm_read(n.m_ext.ext_buf, extbuf, sizeof(extbuf)); ! 312: n.m_data = extbuf + (n.m_data - n.m_ext.ext_buf); ! 313: } else if (n.m_data < m->m_dat + MLEN) ! 314: n.m_data = n.m_dat + (n.m_data - m->m_dat); ! 315: else { ! 316: printf("mbuf screwup\n"); ! 317: continue; ! 318: } ! 319: if (virgin) { ! 320: virgin = 0; ! 321: pk_trace(&n, " X.25: "); ! 322: } ! 323: dumpit("data: ",n.m_data, n.m_len); ! 324: } ! 325: } ! 326: ! 327: dumpit(what, where, n) ! 328: char *what; unsigned short *where; int n; ! 329: { ! 330: unsigned short *s = where; ! 331: unsigned short *z = where + (n+1)/2; ! 332: int count = 0; ! 333: ! 334: if (verbose == 0) ! 335: return; ! 336: printf(what); ! 337: while(s < z) { ! 338: count++; ! 339: printf("%x ",*s++); ! 340: if ((count & 15) == 0) ! 341: putchar('\n'); ! 342: } ! 343: if (count & 15) ! 344: putchar('\n'); ! 345: fflush(stdout); ! 346: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.