|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.