Annotation of 43BSD/ucb/netstat/ns.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1983 Regents of the University of California.
        !             3:  * All rights reserved.  The Berkeley software License Agreement
        !             4:  * specifies the terms and conditions for redistribution.
        !             5:  */
        !             6: 
        !             7: 
        !             8: #ifndef lint
        !             9: static char sccsid[] = "@(#)ns.c       5.3 (Berkeley) 9/12/85";
        !            10: #endif not lint
        !            11: 
        !            12: #include <stdio.h>
        !            13: #include <errno.h>
        !            14: #include <nlist.h>
        !            15: 
        !            16: #include <sys/types.h>
        !            17: #include <sys/socket.h>
        !            18: #include <sys/socketvar.h>
        !            19: #include <sys/mbuf.h>
        !            20: #include <sys/protosw.h>
        !            21: 
        !            22: #include <net/route.h>
        !            23: #include <net/if.h>
        !            24: 
        !            25: #include <netinet/tcp_fsm.h>
        !            26: #include <netinet/tcp_timer.h>
        !            27: 
        !            28: #include <netns/ns.h>
        !            29: #include <netns/ns_pcb.h>
        !            30: #include <netns/idp.h>
        !            31: #include <netns/idp_var.h>
        !            32: #include <netns/ns_error.h>
        !            33: #include <netns/sp.h>
        !            34: #include <netns/spidp.h>
        !            35: #include <netns/spp_var.h>
        !            36: #define SANAMES
        !            37: #include <netns/spp_debug.h>
        !            38: 
        !            39: 
        !            40: struct nspcb nspcb;
        !            41: struct sppcb sppcb;
        !            42: struct socket sockb;
        !            43: struct protosw proto;
        !            44: extern int kmem;
        !            45: extern int Aflag;
        !            46: extern int aflag;
        !            47: extern int nflag;
        !            48: char *ns_prpr();
        !            49: 
        !            50: static int first = 1;
        !            51: 
        !            52: /*
        !            53:  * Print a summary of connections related to a Network Systems
        !            54:  * protocol.  For SPP, also give state of connection.
        !            55:  * Listening processes (aflag) are suppressed unless the
        !            56:  * -a (all) flag is specified.
        !            57:  */
        !            58: 
        !            59: nsprotopr(off, name)
        !            60:        off_t off;
        !            61:        char *name;
        !            62: {
        !            63:        struct nspcb cb;
        !            64:        register struct nspcb *prev, *next;
        !            65:        int isspp;
        !            66: 
        !            67:        if (off == 0)
        !            68:                return;
        !            69:        isspp = strcmp(name, "spp") == 0;
        !            70:        klseek(kmem, off, 0);
        !            71:        read(kmem, &cb, sizeof (struct nspcb));
        !            72:        nspcb = cb;
        !            73:        prev = (struct nspcb *)off;
        !            74:        if (nspcb.nsp_next == (struct nspcb *)off)
        !            75:                return;
        !            76:        for (;nspcb.nsp_next != (struct nspcb *)off; prev = next) {
        !            77:                char *cp;
        !            78:                off_t ppcb;
        !            79: 
        !            80:                next = nspcb.nsp_next;
        !            81:                klseek(kmem, (off_t)next, 0);
        !            82:                read(kmem, &nspcb, sizeof (nspcb));
        !            83:                if (nspcb.nsp_prev != prev) {
        !            84:                        printf("???\n");
        !            85:                        break;
        !            86:                }
        !            87:                if (!aflag && ns_nullhost(nspcb.nsp_faddr) ) {
        !            88:                        continue;
        !            89:                }
        !            90:                klseek(kmem, (off_t)nspcb.nsp_socket, 0);
        !            91:                read(kmem, &sockb, sizeof (sockb));
        !            92:                ppcb = (off_t) nspcb.nsp_pcb;
        !            93:                if (ppcb) {
        !            94:                        if (isspp) {
        !            95:                                klseek(kmem, ppcb, 0);
        !            96:                                read(kmem, &sppcb, sizeof (sppcb));
        !            97:                        } else continue;
        !            98:                } else
        !            99:                        if (isspp) continue;
        !           100:                if (first) {
        !           101:                        printf("Active NS connections");
        !           102:                        if (aflag)
        !           103:                                printf(" (including servers)");
        !           104:                        putchar('\n');
        !           105:                        if (Aflag)
        !           106:                                printf("%-8.8s ", "PCB");
        !           107:                        printf(Aflag ?
        !           108:                                "%-5.5s %-6.6s %-6.6s  %-18.18s %-18.18s %s\n" :
        !           109:                                "%-5.5s %-6.6s %-6.6s  %-22.22s %-22.22s %s\n",
        !           110:                                "Proto", "Recv-Q", "Send-Q",
        !           111:                                "Local Address", "Foreign Address", "(state)");
        !           112:                        first = 0;
        !           113:                }
        !           114:                if (Aflag)
        !           115:                        printf("%8x ", ppcb);
        !           116:                printf("%-5.5s %6d %6d ", name, sockb.so_rcv.sb_cc,
        !           117:                        sockb.so_snd.sb_cc);
        !           118:                printf("  %-22.22s", ns_prpr(&nspcb.nsp_laddr));
        !           119:                printf(" %-22.22s", ns_prpr(&nspcb.nsp_faddr));
        !           120:                if (isspp) {
        !           121:                        extern char *tcpstates[];
        !           122:                        if (sppcb.s_state < 0 || sppcb.s_state >= TCP_NSTATES)
        !           123:                                printf(" %d", sppcb.s_state);
        !           124:                        else
        !           125:                                printf(" %s", tcpstates[sppcb.s_state]);
        !           126:                }
        !           127:                putchar('\n');
        !           128:                prev = next;
        !           129:        }
        !           130: }
        !           131: #define ANY(x,y,z)  ((x) ? printf("\t%d %s%s%s\n",x,y,plural(x),z) : 0)
        !           132: 
        !           133: /*
        !           134:  * Dump SPP statistics structure.
        !           135:  */
        !           136: spp_stats(off, name)
        !           137:        off_t off;
        !           138:        char *name;
        !           139: {
        !           140:        struct spp_istat spp_istat;
        !           141: 
        !           142:        if (off == 0)
        !           143:                return;
        !           144:        klseek(kmem, off, 0);
        !           145:        read(kmem, (char *)&spp_istat, sizeof (spp_istat));
        !           146:        printf("%s:\n", name);
        !           147:        ANY(spp_istat.nonucn, "connection", " dropped due to no new sockets ");
        !           148:        ANY(spp_istat.gonawy, "connection", " terminated due to our end dying");
        !           149:        ANY(spp_istat.nonucn, "connection", " dropped due to inability to connect");
        !           150:        ANY(spp_istat.noconn, "connection", " dropped due to inability to connect");
        !           151:        ANY(spp_istat.notme, "connection", " incompleted due to mismatched id's");
        !           152:        ANY(spp_istat.wrncon, "connection", " dropped due to mismatched id's");
        !           153:        ANY(spp_istat.bdreas, "packet", " dropped out of sequence");
        !           154:        ANY(spp_istat.lstdup, "packet", " duplicating the highest packet");
        !           155:        ANY(spp_istat.notyet, "packet", " refused as exceeding allocation");
        !           156: }
        !           157: 
        !           158: /*
        !           159:  * Dump IDP statistics structure.
        !           160:  */
        !           161: idp_stats(off, name)
        !           162:        off_t off;
        !           163:        char *name;
        !           164: {
        !           165:        struct idpstat idpstat;
        !           166: 
        !           167:        if (off == 0)
        !           168:                return;
        !           169:        klseek(kmem, off, 0);
        !           170:        read(kmem, (char *)&idpstat, sizeof (idpstat));
        !           171:        ANY(idpstat.idps_toosmall, "packet", " smaller than a header");
        !           172:        ANY(idpstat.idps_tooshort, "packet", " smaller than advertised");
        !           173:        ANY(idpstat.idps_badsum, "packet", " with bad checksums");
        !           174: }
        !           175: 
        !           176: static char *((ns_errnames[])[2]) = {
        !           177:        {"Unspecified Error", " at Destination"},
        !           178:        {"Bad Checksum", " at Destination"},
        !           179:        {"No Listener", " at Socket"},
        !           180:        {"Packet", " Refused due to lack of space at Destination"},
        !           181:        {"Unspecified Error", " while gatewayed"},
        !           182:        {"Bad Checksum", " while gatewayed"},
        !           183:        {"Packet", " forwarded too many times"},
        !           184:        {"Packet", " too large to be forwarded"},
        !           185: };
        !           186: 
        !           187: /*
        !           188:  * Dump NS Error statistics structure.
        !           189:  */
        !           190: nserr_stats(off, name)
        !           191:        off_t off;
        !           192:        char *name;
        !           193: {
        !           194:        struct ns_errstat ns_errstat;
        !           195:        register int j;
        !           196:        register int histoprint = 1;
        !           197:        int z;
        !           198: 
        !           199:        if (off == 0)
        !           200:                return;
        !           201:        klseek(kmem, off, 0);
        !           202:        read(kmem, (char *)&ns_errstat, sizeof (ns_errstat));
        !           203:        printf("NS error statistics:\n");
        !           204:        ANY(ns_errstat.ns_es_error, "call", " to ns_error");
        !           205:        ANY(ns_errstat.ns_es_oldshort, "error",
        !           206:                " ignored due to insufficient addressing");
        !           207:        ANY(ns_errstat.ns_es_oldns_err, "error request",
        !           208:                " in response to error packets");
        !           209:        ANY(ns_errstat.ns_es_tooshort, "error packet",
        !           210:                " received incomplete");
        !           211:        ANY(ns_errstat.ns_es_badcode, "error packet",
        !           212:                " received of unknown type");
        !           213:        for(j = 0; j < NS_ERR_MAX; j ++) {
        !           214:                z = ns_errstat.ns_es_outhist[j];
        !           215:                if (z && histoprint) {
        !           216:                        printf("Output Error Histogram:\n");
        !           217:                        histoprint = 0;
        !           218:                }
        !           219:                ANY(z, ns_errnames[j][0], ns_errnames[j][1]);
        !           220:        }
        !           221:        histoprint = 1;
        !           222:        for(j = 0; j < NS_ERR_MAX; j ++) {
        !           223:                z = ns_errstat.ns_es_inhist[j];
        !           224:                if (z && histoprint) {
        !           225:                        printf("Input Error Histogram:\n");
        !           226:                        histoprint = 0;
        !           227:                }
        !           228:                ANY(z, ns_errnames[j][0], ns_errnames[j][1]);
        !           229:        }
        !           230: }
        !           231: static struct sockaddr_ns ssns = {AF_NS};
        !           232: 
        !           233: char *ns_prpr(x)
        !           234: struct ns_addr *x;
        !           235: {
        !           236:        extern char *ns_print();
        !           237:        struct sockaddr_ns *sns = &ssns;
        !           238:        sns->sns_addr = *x;
        !           239:        return(ns_print(sns));
        !           240: }

unix.superglobalmegacorp.com

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