Annotation of 43BSDReno/usr.bin/netstat/iso.c, revision 1.1.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:  * $Header: iso.c,v 3.3 88/12/08 14:44:49 hagens Exp $
                      9:  * $Source: /usr/argo/src/ucb/netstat/RCS/iso.c,v $
                     10:  */
                     11: /*******************************************************************************
                     12:                          Copyright IBM Corporation 1987
                     13: 
                     14:                       All Rights Reserved
                     15: 
                     16: Permission to use, copy, modify, and distribute this software and its 
                     17: documentation for any purpose and without fee is hereby granted, 
                     18: provided that the above copyright notice appear in all copies and that
                     19: both that copyright notice and this permission notice appear in 
                     20: supporting documentation, and that the name of IBM not be
                     21: used in advertising or publicity pertaining to distribution of the
                     22: software without specific, written prior permission.  
                     23: 
                     24: IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
                     25: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
                     26: IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
                     27: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
                     28: WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
                     29: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
                     30: SOFTWARE.
                     31: 
                     32: *******************************************************************************/
                     33: 
                     34: /*
                     35:  *     ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
                     36:  */
                     37: static char sccsid[] = "@(#)iso.c      5.4 (Berkeley) 6/18/90";
                     38: 
                     39: #include <sys/param.h>
                     40: #include <sys/mbuf.h>
                     41: #define KERNEL
                     42: #include <sys/time.h>
                     43: #include <sys/domain.h>
                     44: #include <sys/protosw.h>
                     45: #include <sys/socket.h>
                     46: #include <sys/socketvar.h>
                     47: #include <errno.h>
                     48: #include <net/if.h>
                     49: #include <net/route.h>
                     50: #include <netiso/iso.h>
                     51: #include <netiso/iso_errno.h>
                     52: #include <netiso/clnp.h>
                     53: #include <netiso/esis.h>
                     54: #include <netiso/clnp_stat.h>
                     55: #include <netiso/argo_debug.h>
                     56: #undef satosiso
                     57: #include <netiso/tp_param.h>
                     58: #include <netiso/tp_states.h>
                     59: #include <netiso/tp_astring.c>
                     60: #include <netiso/tp_pcb.h>
                     61: #include <netiso/tp_stat.h>
                     62: #include <netiso/iso_pcb.h>
                     63: #include <netiso/cltp_var.h>
                     64: #include <netiso/cons.h>
                     65: #ifdef IncStat
                     66: #undef IncStat
                     67: #endif
                     68: #include <netiso/cons_pcb.h>
                     69: #include <netdb.h>
                     70: 
                     71: 
                     72: /*
                     73:  *     Dump esis stats
                     74:  */
                     75: esis_stats(off, name)
                     76:        off_t   off;
                     77:        char    *name;
                     78: {
                     79:        struct esis_stat esis_stat;
                     80: 
                     81:        if (off == 0)
                     82:                return;
                     83:        kvm_read(off, (char *)&esis_stat, sizeof (struct esis_stat));
                     84:        printf("%s:\n", name);
                     85:        printf("\t%d esh sent, %d esh received\n", esis_stat.es_eshsent,
                     86:                esis_stat.es_eshrcvd);
                     87:        printf("\t%d ish sent, %d ish received\n", esis_stat.es_ishsent,
                     88:                esis_stat.es_ishrcvd);
                     89:        printf("\t%d rd sent, %d rd received\n", esis_stat.es_rdsent,
                     90:                esis_stat.es_rdrcvd);
                     91:        printf("\t%d pdus not sent due to insufficient memory\n", 
                     92:                esis_stat.es_nomem);
                     93:        printf("\t%d pdus received with bad checksum\n", esis_stat.es_badcsum);
                     94:        printf("\t%d pdus received with bad version number\n", 
                     95:                esis_stat.es_badvers);
                     96:        printf("\t%d pdus received with bad type field\n", esis_stat.es_badtype);
                     97:        printf("\t%d short pdus received\n", esis_stat.es_toosmall);
                     98: }
                     99: 
                    100: /*
                    101:  * Dump clnp statistics structure.
                    102:  */
                    103: clnp_stats(off, name)
                    104:        off_t off;
                    105:        char *name;
                    106: {
                    107:        struct clnp_stat clnp_stat;
                    108: 
                    109:        if (off == 0)
                    110:                return;
                    111:        kvm_read(off, (char *)&clnp_stat, sizeof (clnp_stat));
                    112: 
                    113:        printf("%s:\n\t%d total packets sent\n", name, clnp_stat.cns_sent);
                    114:        printf("\t%d total fragments sent\n", clnp_stat.cns_fragments);
                    115:        printf("\t%d total packets received\n", clnp_stat.cns_total);
                    116:        printf("\t%d with fixed part of header too small\n", 
                    117:                clnp_stat.cns_toosmall);
                    118:        printf("\t%d with header length not reasonable\n", clnp_stat.cns_badhlen);
                    119:        printf("\t%d incorrect checksum%s\n", 
                    120:                clnp_stat.cns_badcsum, plural(clnp_stat.cns_badcsum));
                    121:        printf("\t%d with unreasonable address lengths\n", clnp_stat.cns_badaddr);
                    122:        printf("\t%d with forgotten segmentation information\n", 
                    123:                clnp_stat.cns_noseg);
                    124:        printf("\t%d with an incorrect protocol identifier\n", clnp_stat.cns_noproto);
                    125:        printf("\t%d with an incorrect version\n", clnp_stat.cns_badvers);
                    126:        printf("\t%d dropped because the ttl has expired\n", 
                    127:                clnp_stat.cns_ttlexpired);
                    128:        printf("\t%d clnp cache misses\n", clnp_stat.cns_cachemiss);
                    129:        printf("\t%d clnp congestion experience bits set\n", 
                    130:                clnp_stat.cns_congest_set);
                    131:        printf("\t%d clnp congestion experience bits received\n", 
                    132:                clnp_stat.cns_congest_rcvd);
                    133: }
                    134: /*
                    135:  * Dump CLTP statistics structure.
                    136:  */
                    137: cltp_stats(off, name)
                    138:        off_t off;
                    139:        char *name;
                    140: {
                    141:        struct cltpstat cltpstat;
                    142: 
                    143:        if (off == 0)
                    144:                return;
                    145:        kvm_read(off, (char *)&cltpstat, sizeof (cltpstat));
                    146:        printf("%s:\n\t%u incomplete header%s\n", name,
                    147:                cltpstat.cltps_hdrops, plural(cltpstat.cltps_hdrops));
                    148:        printf("\t%u bad data length field%s\n",
                    149:                cltpstat.cltps_badlen, plural(cltpstat.cltps_badlen));
                    150:        printf("\t%u bad checksum%s\n",
                    151:                cltpstat.cltps_badsum, plural(cltpstat.cltps_badsum));
                    152: }
                    153: 
                    154: struct tp_pcb tpcb;
                    155: struct isopcb isopcb;
                    156: struct socket sockb;
                    157: union  {
                    158: struct sockaddr_iso    siso;
                    159: char   data[128];
                    160: } laddr, faddr;
                    161: #define kget(o, p) \
                    162:        (kvm_read((off_t)(o), (char *)&p, sizeof (p)))
                    163: extern int Aflag;
                    164: extern int aflag;
                    165: extern int nflag;
                    166: 
                    167: static int first = 1;
                    168: 
                    169: /*
                    170:  * Print a summary of connections related to an Internet
                    171:  * protocol.  For TP, also give state of connection.
                    172:  * Listening processes (aflag) are suppressed unless the
                    173:  * -a (all) flag is specified.
                    174:  */
                    175: iso_protopr(off, name)
                    176:        off_t off;
                    177:        char *name;
                    178: {
                    179:        struct isopcb cb;
                    180:        register struct isopcb *prev, *next;
                    181:        int istp = (strcmp(name, "tp") == 0);
                    182: 
                    183:        if (off == 0) {
                    184:                printf("%s control block: symbol not in namelist\n", name);
                    185:                return;
                    186:        }
                    187:        kget(off, cb);
                    188:        isopcb = cb;
                    189:        prev = (struct isopcb *)off;
                    190:        if (isopcb.isop_next == (struct isopcb *)off)
                    191:                return;
                    192:        while (isopcb.isop_next != (struct isopcb *)off) {
                    193:                next = isopcb.isop_next;
                    194:                kget(next, isopcb);
                    195:                if (isopcb.isop_prev != prev) {
                    196:                        printf("prev 0x%x next 0x%x isop_prev 0x%x isop_next 0x%x???\n",
                    197:                                prev, next, isopcb.isop_prev, isopcb.isop_next);
                    198:                        break;
                    199:                }
                    200:                kget(isopcb.isop_socket, sockb);
                    201:                if (istp) {
                    202:                        kget(sockb.so_tpcb, tpcb);
                    203:                        if (tpcb.tp_state == ST_ERROR)
                    204:                                fprintf(stderr,"addr: 0x%x, prev 0x%x\n", next, prev);
                    205:                        if (!aflag &&
                    206:                                tpcb.tp_state == TP_LISTENING ||
                    207:                                tpcb.tp_state == TP_CLOSED ||
                    208:                                tpcb.tp_state == TP_REFWAIT) {
                    209:                                prev = next;
                    210:                                continue;
                    211:                        }
                    212:                }
                    213:                if (first) {
                    214:                        printf("Active ISO net connections");
                    215:                        if (aflag)
                    216:                                printf(" (including servers)");
                    217:                        putchar('\n');
                    218:                        if (Aflag)
                    219:                                printf("%-8.8s ", "PCB");
                    220:                        printf(Aflag ?
                    221:                                "%-5.5s %-6.6s %-6.6s  %-18.18s %-18.18s %s\n" :
                    222:                                "%-5.5s %-6.6s %-6.6s  %-22.22s %-22.22s %s\n",
                    223:                                "Proto", "Recv-Q", "Send-Q",
                    224:                                "Local Address", "Foreign Address", "(state)");
                    225:                        first = 0;
                    226:                }
                    227:                if (Aflag)
                    228:                        printf("%8x ",
                    229:                                (istp ? (off_t)sockb.so_tpcb : (off_t)next));
                    230:                printf("%-5.5s %6d %6d ", name, sockb.so_rcv.sb_cc,
                    231:                        sockb.so_snd.sb_cc);
                    232:                if (isopcb.isop_laddr == 0)
                    233:                        printf("*.*\t");
                    234:                else {
                    235:                        if ((char *)isopcb.isop_laddr == ((char *)next) +
                    236:                                _offsetof(struct isopcb, isop_sladdr))
                    237:                                laddr.siso = isopcb.isop_sladdr;
                    238:                        else
                    239:                                kget(isopcb.isop_laddr, laddr);
                    240:                        isonetprint(&laddr, 1);
                    241:                }
                    242:                if (isopcb.isop_faddr == 0)
                    243:                        printf("*.*\t");
                    244:                else {
                    245:                        if ((char *)isopcb.isop_faddr == ((char *)next) +
                    246:                                _offsetof(struct isopcb, isop_sfaddr))
                    247:                                faddr.siso = isopcb.isop_sfaddr;
                    248:                        else
                    249:                                kget(isopcb.isop_faddr, faddr);
                    250:                        isonetprint(&faddr, 0);
                    251:                }
                    252:                if (istp) {
                    253:                        if (tpcb.tp_state >= tp_NSTATES)
                    254:                                printf(" %d", tpcb.tp_state);
                    255:                        else
                    256:                                printf(" %-12.12s", tp_sstring[tpcb.tp_state]);
                    257:                }
                    258:                putchar('\n');
                    259:                prev = next;
                    260:        }
                    261: }
                    262: 
                    263: /*
                    264:  * Pretty print an iso address (net address + port).
                    265:  * If the nflag was specified, use numbers instead of names.
                    266:  */
                    267: 
                    268: #ifdef notdef
                    269: char *
                    270: isonetname(iso)
                    271:        register struct iso_addr *iso;
                    272: {
                    273:        struct sockaddr_iso sa;
                    274:        struct iso_hostent *ihe = 0;
                    275:        struct iso_hostent *iso_gethostentrybyaddr();
                    276:        struct iso_hostent *iso_getserventrybytsel();
                    277:        struct iso_hostent Ihe;
                    278:        static char line[80];
                    279:        char *index();
                    280: 
                    281:        bzero(line, sizeof(line));
                    282:        if( iso->isoa_afi ) {
                    283:                sa.siso_family = AF_ISO;
                    284:                sa.siso_addr = *iso;
                    285:                sa.siso_tsuffix = 0;
                    286: 
                    287:                if (!nflag )
                    288:                        ihe = iso_gethostentrybyaddr( &sa, 0, 0 );
                    289:                if( ihe ) {
                    290:                        Ihe = *ihe;
                    291:                        ihe = &Ihe;
                    292:                        sprintf(line, "%s", ihe->isoh_hname);
                    293:                } else {
                    294:                        sprintf(line, "%s", iso_ntoa(iso));
                    295:                }
                    296:        } else {
                    297:                sprintf(line, "*");
                    298:        }
                    299:        return line;
                    300: }
                    301: 
                    302: isonetprint(iso, sufx, sufxlen, islocal)
                    303:        register struct iso_addr *iso;
                    304:        char *sufx;
                    305:        u_short sufxlen;
                    306:        int islocal;
                    307: {
                    308:        struct iso_hostent *iso_getserventrybytsel(), *ihe;
                    309:        struct iso_hostent Ihe;
                    310:        char *line, *cp, *index();
                    311:        int Alen = Aflag?18:22;
                    312: 
                    313:        line =  isonetname(iso);
                    314:        cp = index(line, '\0');
                    315:        ihe = (struct iso_hostent *)0;
                    316: 
                    317:        if( islocal )
                    318:                islocal = 20;
                    319:        else 
                    320:                islocal = 22 + Alen;
                    321: 
                    322:        if(Aflag)
                    323:                islocal += 10 ;
                    324: 
                    325:        if(!nflag) {
                    326:                if( (cp -line)>10 ) {
                    327:                        cp = line+10;
                    328:                        bzero(cp, sizeof(line)-10);
                    329:                }
                    330:        }
                    331: 
                    332:        *cp++ = '.';
                    333:        if(sufxlen) {
                    334:                if( !Aflag && !nflag && (ihe=iso_getserventrybytsel(sufx, sufxlen))) {
                    335:                        Ihe = *ihe;
                    336:                        ihe = &Ihe;
                    337:                }
                    338:                if( ihe && (strlen(ihe->isoh_aname)>0) ) {
                    339:                        sprintf(cp, "%s", ihe->isoh_aname);
                    340:                } else  {
                    341:                        iso_sprinttsel(cp, sufx, sufxlen);
                    342:                }
                    343:        } else
                    344:                sprintf(cp, "*");
                    345:        /*
                    346:        fprintf(stdout, Aflag?" %-18.18s":" %-22.22s", line);
                    347:        */
                    348: 
                    349:        if( strlen(line) > Alen ) {
                    350:                fprintf(stdout, " %s", line);
                    351:                fprintf(stdout, "\n %*.s", islocal+Alen," ");
                    352:        } else {
                    353:                fprintf(stdout, " %-*.*s", Alen, Alen,line);
                    354:        }
                    355: }
                    356: #endif
                    357: 
                    358: #ifdef notdef
                    359: x25_protopr(off, name)
                    360:        off_t off;
                    361:        char *name;
                    362: {
                    363:        static char *xpcb_states[] = {
                    364:                "CLOSED",
                    365:                "LISTENING",
                    366:                "CLOSING",
                    367:                "CONNECTING",
                    368:                "ACKWAIT",
                    369:                "OPEN",
                    370:        };
                    371:        register struct isopcb *prev, *next;
                    372:        struct x25_pcb xpcb;
                    373: 
                    374:        if (off == 0) {
                    375:                printf("%s control block: symbol not in namelist\n", name);
                    376:                return;
                    377:        }
                    378:        kvm_read(off, &xpcb, sizeof (struct x25_pcb));
                    379:        prev = (struct isopcb *)off;
                    380:        if (xpcb.x_next == (struct isopcb *)off)
                    381:                return;
                    382:        while (xpcb.x_next != (struct isopcb *)off) {
                    383:                next = isopcb.isop_next;
                    384:                kvm_read((off_t)next, &xpcb, sizeof (struct x25_pcb));
                    385:                if (xpcb.x_prev != prev) {
                    386:                        printf("???\n");
                    387:                        break;
                    388:                }
                    389:                kvm_read((off_t)xpcb.x_socket, &sockb, sizeof (sockb));
                    390: 
                    391:                if (!aflag &&
                    392:                        xpcb.x_state == LISTENING ||
                    393:                        xpcb.x_state == TP_CLOSED ) {
                    394:                        prev = next;
                    395:                        continue;
                    396:                }
                    397:                if (first) {
                    398:                        printf("Active X25 net connections");
                    399:                        if (aflag)
                    400:                                printf(" (including servers)");
                    401:                        putchar('\n');
                    402:                        if (Aflag)
                    403:                                printf("%-8.8s ", "PCB");
                    404:                        printf(Aflag ?
                    405:                                "%-5.5s %-6.6s %-6.6s  %-18.18s %-18.18s %s\n" :
                    406:                                "%-5.5s %-6.6s %-6.6s  %-22.22s %-22.22s %s\n",
                    407:                                "Proto", "Recv-Q", "Send-Q",
                    408:                                "Local Address", "Foreign Address", "(state)");
                    409:                        first = 0;
                    410:                }
                    411:                printf("%-5.5s %6d %6d ", name, sockb.so_rcv.sb_cc,
                    412:                        sockb.so_snd.sb_cc);
                    413:                isonetprint(&xpcb.x_laddr.siso_addr, &xpcb.x_lport, 
                    414:                        sizeof(xpcb.x_lport), 1);
                    415:                isonetprint(&xpcb.x_faddr.siso_addr, &xpcb.x_fport, 
                    416:                        sizeof(xpcb.x_lport), 0);
                    417:                if (xpcb.x_state < 0 || xpcb.x_state >= x25_NSTATES)
                    418:                        printf(" 0x0x0x0x0x0x0x0x0x%x", xpcb.x_state);
                    419:                else
                    420:                        printf(" %-12.12s", xpcb_states[xpcb.x_state]);
                    421:                putchar('\n');
                    422:                prev = next;
                    423:        }
                    424: }
                    425: #endif
                    426: 
                    427: struct tp_stat tp_stat;
                    428: 
                    429: tp_stats(off, name)
                    430: caddr_t off, name;
                    431: {
                    432:        if (off == 0) {
                    433:                printf("TP not configured\n\n");
                    434:                return;
                    435:        }
                    436:        printf("%s:\n", name);
                    437:        kget(off, tp_stat);
                    438:        tprintstat(&tp_stat, 8);
                    439: }
                    440: 
                    441: #define OUT stdout
                    442: 
                    443: #define plural(x) (x>1?"s":"")
                    444: 
                    445: tprintstat(s, indent)
                    446: register struct tp_stat *s;
                    447: int indent;
                    448: {
                    449:        fprintf(OUT,
                    450:                "%*sReceiving:\n",indent," ");
                    451:        fprintf(OUT,
                    452:                "\t%*s%d variable parameter%s ignored\n", indent," ",
                    453:                s->ts_param_ignored ,plural(s->ts_param_ignored));
                    454:        fprintf(OUT,
                    455:                "\t%*s%d invalid parameter code%s\n", indent, " ",
                    456:                s->ts_inv_pcode ,plural(s->ts_inv_pcode));
                    457:        fprintf(OUT,
                    458:                "\t%*s%d invalid parameter value%s\n", indent, " ",
                    459:                s->ts_inv_pval ,plural(s->ts_inv_pval));
                    460:        fprintf(OUT,
                    461:                "\t%*s%d invalid dutype%s\n", indent, " ",
                    462:                s->ts_inv_dutype ,plural(s->ts_inv_dutype));
                    463:        fprintf(OUT,
                    464:                "\t%*s%d negotiation failure%s\n", indent, " ",
                    465:                s->ts_negotfailed ,plural(s->ts_negotfailed));
                    466:        fprintf(OUT,
                    467:                "\t%*s%d invalid destination reference%s\n", indent, " ",
                    468:                s->ts_inv_dref ,plural(s->ts_inv_dref));
                    469:        fprintf(OUT,
                    470:                "\t%*s%d invalid suffix parameter%s\n", indent, " ",
                    471:                s->ts_inv_sufx ,plural(s->ts_inv_sufx));
                    472:        fprintf(OUT,
                    473:                "\t%*s%d invalid length\n",indent, " ", s->ts_inv_length);
                    474:        fprintf(OUT,
                    475:                "\t%*s%d invalid checksum%s\n", indent, " ",
                    476:                s->ts_bad_csum ,plural(s->ts_bad_csum));
                    477:        fprintf(OUT,
                    478:                "\t%*s%d DT%s out of order\n", indent, " ",
                    479:                s->ts_dt_ooo ,plural(s->ts_dt_ooo));
                    480:        fprintf(OUT,
                    481:                "\t%*s%d DT%s not in window\n", indent, " ",
                    482:                s->ts_dt_niw ,plural(s->ts_dt_niw));
                    483:        fprintf(OUT,
                    484:                "\t%*s%d duplicate DT%s\n", indent, " ",
                    485:                s->ts_dt_dup ,plural(s->ts_dt_dup));
                    486:        fprintf(OUT,
                    487:                        "\t%*s%d XPD%s not in window\n", indent, " ",
                    488:                        s->ts_xpd_niw ,plural(s->ts_xpd_niw));
                    489:                fprintf(OUT,
                    490:                        "\t%*s%d XPD%s w/o credit to stash\n", indent, " ",
                    491:                s->ts_xpd_dup ,plural(s->ts_xpd_dup));
                    492:        fprintf(OUT,
                    493:                "\t%*s%d time%s local credit reneged\n", indent, " ",
                    494:                s->ts_lcdt_reduced ,plural(s->ts_lcdt_reduced));
                    495:        fprintf(OUT,
                    496:                "\t%*s%d concatenated TPDU%s\n", indent, " ",
                    497:                s->ts_concat_rcvd ,plural(s->ts_concat_rcvd));
                    498:        fprintf(OUT,
                    499:                "%*sSending:\n", indent, " ");
                    500:        fprintf(OUT,
                    501:                "\t%*s%d XPD mark%s discarded\n", indent, " ",
                    502:                s->ts_xpdmark_del ,plural(s->ts_xpdmark_del));
                    503:        fprintf(OUT,
                    504:                "\t%*sXPD stopped data flow %d time%s\n", indent, " ",
                    505:                s->ts_xpd_intheway ,plural(s->ts_xpd_intheway));
                    506:        fprintf(OUT,
                    507:                "\t%*s%d time%s foreign window closed\n", indent, " ",
                    508:                s->ts_zfcdt ,plural(s->ts_zfcdt));
                    509:        fprintf(OUT,
                    510:                "%*sMiscellaneous:\n", indent, " ");
                    511:        fprintf(OUT,
                    512:                "\t%*s%d small mbuf%s\n", indent, " ",
                    513:                s->ts_mb_small ,plural(s->ts_mb_small));
                    514:        fprintf(OUT,
                    515:                "\t%*s%d cluster%s\n", indent, " ",
                    516:                s->ts_mb_cluster, plural(s->ts_mb_cluster));
                    517:        fprintf(OUT,
                    518:                "\t%*s%d source quench \n",indent, " ", 
                    519:                s->ts_quench);
                    520:        fprintf(OUT,
                    521:                "\t%*s%d dec bit%s\n", indent, " ",
                    522:                s->ts_rcvdecbit, plural(s->ts_rcvdecbit));
                    523:        fprintf(OUT,
                    524:                "\t%*sM:L ( M mbuf chains of length L)\n", indent, " ");
                    525:        {
                    526:                register int j;
                    527: 
                    528:                fprintf(OUT, "\t%*s%d: over 16\n", indent, " ",
                    529:                s->ts_mb_len_distr[0]);
                    530:                for( j=1; j<=8; j++) {
                    531:                        fprintf(OUT,
                    532:                                "\t%*s%d: %d\t\t%d: %d\n", indent, " ",
                    533:                                s->ts_mb_len_distr[j],j,
                    534:                                s->ts_mb_len_distr[j<<1],j<<1
                    535:                                );
                    536:                }
                    537:        }
                    538:        fprintf(OUT,
                    539:                "\t%*s%d EOT rcvd\n",  indent, " ", s->ts_eot_input);
                    540:        fprintf(OUT,
                    541:                "\t%*s%d EOT sent\n",  indent, " ", s->ts_EOT_sent);
                    542:        fprintf(OUT,
                    543:                "\t%*s%d EOT indication%s\n",  indent, " ",
                    544:                s->ts_eot_user ,plural(s->ts_eot_user));
                    545: 
                    546:        fprintf(OUT,
                    547:                "%*sConnections:\n", indent, " ");
                    548:        fprintf(OUT,
                    549:                "\t%*s%d connection%s used extended format\n",  indent, " ",
                    550:                s->ts_xtd_fmt ,plural(s->ts_xtd_fmt));
                    551:        fprintf(OUT,
                    552:                "\t%*s%d connection%s allowed transport expedited data\n",  indent, " ",
                    553:                s->ts_use_txpd ,plural(s->ts_use_txpd));
                    554:        fprintf(OUT,
                    555:                "\t%*s%d connection%s turned off checksumming\n",  indent, " ",
                    556:                s->ts_csum_off ,plural(s->ts_csum_off));
                    557:        fprintf(OUT,
                    558:                "\t%*s%d connection%s dropped due to retrans limit\n",  indent, " ",
                    559:                s->ts_conn_gaveup ,plural(s->ts_conn_gaveup));
                    560:        fprintf(OUT,
                    561:                "\t%*s%d tp 4 connection%s\n",  indent, " ",
                    562:                s->ts_tp4_conn ,plural(s->ts_tp4_conn));
                    563:        fprintf(OUT,
                    564:                "\t%*s%d tp 0 connection%s\n",  indent, " ",
                    565:                s->ts_tp0_conn ,plural(s->ts_tp0_conn));
                    566:        {
                    567:                register int j, div;
                    568:                register float f;
                    569:                static char *name[]= {
                    570:                        "~LOCAL, PDN", 
                    571:                        "~LOCAL,~PDN",
                    572:                        " LOCAL,~PDN",
                    573:                        " LOCAL, PDN"
                    574:                };
                    575: #define factor(i) \
                    576:        div = (s->ts_rtt[(i)].tv_sec * 1000000) + \
                    577:                s->ts_rtt[(i)].tv_usec ;\
                    578:        if(div) {\
                    579:                f = ((s->ts_rtv[(i)].tv_sec * 1000000) + \
                    580:                                s->ts_rtv[(i)].tv_usec)/div;  \
                    581:                div = (int) (f + 0.5);\
                    582:        }
                    583: 
                    584:                fprintf(OUT, 
                    585:                        "\n%*sRound trip times, listed in (sec: usec):\n", indent, " ");
                    586:                fprintf(OUT, 
                    587:                        "\t%*s%11.11s  %12.12s | %12.12s | %s\n", indent, " ",
                    588:                                "Category",
                    589:                                "Smoothed avg", "Deviation", "Deviation/Avg");
                    590:                for( j=0; j<=3; j++) {
                    591:                        factor(j);
                    592:                        fprintf(OUT,
                    593:                                "\t%*s%11.11s: %5d:%-6d | %5d:%-6d | %-6d\n", indent, " ",
                    594:                                name[j],
                    595:                                s->ts_rtt[j].tv_sec,
                    596:                                s->ts_rtt[j].tv_usec,
                    597:                                s->ts_rtv[j].tv_sec,
                    598:                                s->ts_rtv[j].tv_usec,
                    599:                                div);
                    600:                }
                    601:        }
                    602:        fprintf(OUT,
                    603: "\n%*sTpdus RECVD [%d valid, %3.6f %% of total (%d); %d dropped]\n",indent," ",
                    604:                s->ts_tpdu_rcvd ,
                    605:                ((s->ts_pkt_rcvd > 0) ? 
                    606:                        ((100 * (float)s->ts_tpdu_rcvd)/(float)s->ts_pkt_rcvd)
                    607:                        : 0),
                    608:                s->ts_pkt_rcvd,
                    609:                s->ts_recv_drop );
                    610: 
                    611:        fprintf(OUT,
                    612:                "\t%*sDT  %6d   AK  %6d   DR  %4d   CR  %4d \n", indent, " ",
                    613:                s->ts_DT_rcvd, s->ts_AK_rcvd, s->ts_DR_rcvd, s->ts_CR_rcvd);
                    614:        fprintf(OUT,
                    615:                "\t%*sXPD %6d   XAK %6d   DC  %4d   CC  %4d   ER  %4d\n",  indent, " ",
                    616:                s->ts_XPD_rcvd, s->ts_XAK_rcvd, s->ts_DC_rcvd, s->ts_CC_rcvd,
                    617:                s->ts_ER_rcvd);
                    618:        fprintf(OUT,
                    619:                "\n%*sTpdus SENT [%d total, %d dropped]\n",  indent, " ",
                    620:                s->ts_tpdu_sent, s->ts_send_drop);
                    621: 
                    622:        fprintf(OUT,
                    623:                "\t%*sDT  %6d   AK  %6d   DR  %4d   CR  %4d \n", indent, " ",
                    624:                s->ts_DT_sent, s->ts_AK_sent, s->ts_DR_sent, s->ts_CR_sent);
                    625:        fprintf(OUT,
                    626:                "\t%*sXPD %6d   XAK %6d   DC  %4d   CC  %4d   ER  %4d\n",  indent, " ",
                    627:                s->ts_XPD_sent, s->ts_XAK_sent, s->ts_DC_sent, s->ts_CC_sent,
                    628:                s->ts_ER_sent);
                    629: 
                    630:        fprintf(OUT,
                    631:                "\n%*sRetransmissions:\n", indent, " ");
                    632: #define PERCENT(X,Y) (((Y)>0)?((100 *(float)(X)) / (float) (Y)):0)
                    633: 
                    634:        fprintf(OUT,
                    635:        "\t%*sCR  %6d   CC  %6d   DR  %6d \n", indent, " ",
                    636:                s->ts_retrans_cr, s->ts_retrans_cc, s->ts_retrans_dr);
                    637:        fprintf(OUT,
                    638:        "\t%*sDT  %6d (%5.2f%%)\n", indent, " ",
                    639:                s->ts_retrans_dt,
                    640:                PERCENT(s->ts_retrans_dt, s->ts_DT_sent));
                    641:        fprintf(OUT,
                    642:        "\t%*sXPD %6d (%5.2f%%)\n",  indent, " ",
                    643:                s->ts_retrans_xpd,
                    644:                PERCENT(s->ts_retrans_xpd, s->ts_XPD_sent));
                    645:        
                    646: 
                    647:        fprintf(OUT,
                    648:                "\n%*sE Timers: [%6d ticks]\n", indent, " ", s->ts_Eticks);
                    649:        fprintf(OUT,
                    650:                "%*s%6d timer%s set \t%6d timer%s expired \t%6d timer%s cancelled\n",indent, " ",
                    651:                s->ts_Eset ,plural(s->ts_Eset),
                    652:                s->ts_Eexpired ,plural(s->ts_Eexpired),
                    653:                s->ts_Ecan_act ,plural(s->ts_Ecan_act));
                    654: 
                    655:        fprintf(OUT,
                    656:                "\n%*sC Timers: [%6d ticks]\n",  indent, " ",s->ts_Cticks);
                    657:        fprintf(OUT,
                    658:        "%*s%6d timer%s set \t%6d timer%s expired \t%6d timer%s cancelled\n",
                    659:                indent, " ",
                    660:                s->ts_Cset ,plural(s->ts_Cset),
                    661:                s->ts_Cexpired ,plural(s->ts_Cexpired),
                    662:                s->ts_Ccan_act ,plural(s->ts_Ccan_act));
                    663:        fprintf(OUT,
                    664:                "%*s%6d inactive timer%s cancelled\n", indent, " ",
                    665:                s->ts_Ccan_inact ,plural(s->ts_Ccan_inact));
                    666: 
                    667:        fprintf(OUT,
                    668:                "\n%*sPathological debugging activity:\n", indent, " ");
                    669:        fprintf(OUT,
                    670:                "\t%*s%6d CC%s sent to zero dref\n", indent, " ",
                    671:                s->ts_zdebug ,plural(s->ts_zdebug));
                    672:        /* SAME LINE AS ABOVE */
                    673:        fprintf(OUT,
                    674:                "\t%*s%6d random DT%s dropped\n", indent, " ",
                    675:                s->ts_ydebug ,plural(s->ts_ydebug));
                    676:        fprintf(OUT,
                    677:                "\t%*s%6d illegally large XPD TPDU%s\n", indent, " ",
                    678:                s->ts_vdebug ,plural(s->ts_vdebug));
                    679:        fprintf(OUT,
                    680:                "\t%*s%6d faked reneging of cdt\n", indent, " ",
                    681:                s->ts_ldebug );
                    682: 
                    683:        fprintf(OUT,
                    684:                "\n%*sACK reasons:\n", indent, " ");
                    685:        fprintf(OUT, "\t%*s%6d not acked immediately\n", indent, " ",
                    686:                                                                                s->ts_ackreason[_ACK_DONT_] );
                    687:        fprintf(OUT, "\t%*s%6d strategy==each\n", indent, " ",
                    688:                                                                                s->ts_ackreason[_ACK_STRAT_EACH_] );
                    689:        fprintf(OUT, "\t%*s%6d strategy==fullwindow\n", indent, " ",
                    690:                                                                                s->ts_ackreason[_ACK_STRAT_FULLWIN_] );
                    691:        fprintf(OUT, "\t%*s%6d duplicate DT\n", indent, " ",
                    692:                                                                                s->ts_ackreason[_ACK_DUP_] );
                    693:        fprintf(OUT, "\t%*s%6d EOTSDU\n", indent, " ",
                    694:                                                                                s->ts_ackreason[_ACK_EOT_] );
                    695:        fprintf(OUT, "\t%*s%6d reordered DT\n", indent, " ",
                    696:                                                                                s->ts_ackreason[_ACK_REORDER_] );
                    697:        fprintf(OUT, "\t%*s%6d user rcvd\n", indent, " ",
                    698:                                                                                s->ts_ackreason[_ACK_USRRCV_] );
                    699:        fprintf(OUT, "\t%*s%6d fcc reqd\n",     indent, " ",
                    700:                                                                                s->ts_ackreason[_ACK_FCC_] );
                    701: }
                    702: #ifndef SSEL
                    703: #define SSEL(s) ((s)->siso_tlen + TSEL(s))
                    704: #define PSEL(s) ((s)->siso_slen + SSEL(s))
                    705: #endif
                    706: 
                    707: isonetprint(siso, islocal)
                    708: register struct sockaddr_iso *siso;
                    709: int islocal;
                    710: {
                    711:        hexprint(siso->siso_nlen, siso->siso_addr.isoa_genaddr, "{}");
                    712:        if (siso->siso_tlen || siso->siso_slen || siso->siso_plen)
                    713:                hexprint(siso->siso_tlen, TSEL(siso), "()");
                    714:        if (siso->siso_slen || siso->siso_plen)
                    715:                hexprint(siso->siso_slen, SSEL(siso), "[]");
                    716:        if (siso->siso_plen)
                    717:                hexprint(siso->siso_plen, PSEL(siso), "<>");
                    718:        putchar(' ');
                    719: }
                    720: static char hexlist[] = "0123456789abcdef", obuf[128];
                    721: 
                    722: hexprint(n, buf, delim)
                    723: char *buf, *delim;
                    724: {
                    725:        register u_char *in = (u_char *)buf, *top = in + n;
                    726:        register char *out = obuf;
                    727:        register int i;
                    728: 
                    729:        if (n == 0)
                    730:                return;
                    731:        while (in < top) {
                    732:                i = *in++;
                    733:                *out++ = '.';
                    734:                if (i > 0xf) {
                    735:                        out[1] = hexlist[i & 0xf];
                    736:                        i >>= 4;
                    737:                        out[0] = hexlist[i];
                    738:                        out += 2;
                    739:                } else
                    740:                        *out++ = hexlist[i];
                    741:        }
                    742:        *obuf = *delim; *out++ = delim[1]; *out = 0;
                    743:        printf("%s", obuf);
                    744: }

unix.superglobalmegacorp.com

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