Annotation of Net2/tests/netccitt/pk_dump.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.