1: /* 2: * Copyright (c) 1983,1988 Regents of the University of California. 3: * All rights reserved. 4: * 5: * Redistribution and use in source and binary forms are permitted 6: * provided that this notice is preserved and that due credit is given 7: * to the University of California at Berkeley. The name of the University 8: * may not be used to endorse or promote products derived from this 9: * software without specific prior written permission. This software 10: * is provided ``as is'' without express or implied warranty. 11: */ 12: 13: #if defined(DOSCCS) && !defined(lint) 14: static char sccsid[] = "@(#)mbuf.c 5.3.1 (2.11BSD GTE) 1/1/94"; 15: #endif 16: 17: #include <stdio.h> 18: #include <sys/param.h> 19: #include <sys/mbuf.h> 20: #define YES 1 21: typedef int bool; 22: 23: struct mbstat mbstat; 24: extern int kmem; 25: 26: static struct mbtypes { 27: int mt_type; 28: char *mt_name; 29: } mbtypes[] = { 30: { MT_DATA, "data" }, 31: { MT_HEADER, "packet headers" }, 32: { MT_SOCKET, "socket structures" }, 33: { MT_PCB, "protocol control blocks" }, 34: { MT_RTABLE, "routing table entries" }, 35: { MT_HTABLE, "IMP host table entries" }, 36: { MT_ATABLE, "address resolution tables" }, 37: { MT_FTABLE, "fragment reassembly queue headers" }, 38: { MT_SONAME, "socket names and addresses" }, 39: { MT_ZOMBIE, "zombie process information" }, 40: { MT_SOOPTS, "socket options" }, 41: { MT_RIGHTS, "access rights" }, 42: { MT_IFADDR, "interface addresses" }, 43: { 0, 0 } 44: }; 45: 46: int nmbtypes = sizeof(mbstat.m_mtypes) / sizeof(short); 47: bool seen[NMBTYPES]; /* "have we seen this type yet?" */ 48: 49: #ifdef pdp11 50: #define klseek slseek 51: #endif 52: 53: /* 54: * Print mbuf statistics. 55: */ 56: mbpr(mbaddr) 57: off_t mbaddr; 58: { 59: register int totmbufs; 60: long totmem, totfree; 61: register int i; 62: register struct mbtypes *mp; 63: 64: if (nmbtypes != NMBTYPES) { 65: fprintf(stderr, "unexpected change to mbstat; check source\n"); 66: return; 67: } 68: if (mbaddr == 0) { 69: printf("mbstat: symbol not in namelist\n"); 70: return; 71: } 72: klseek(kmem, mbaddr, 0); 73: if (read(kmem, (char *)&mbstat, sizeof (mbstat)) != sizeof (mbstat)) { 74: printf("mbstat: bad read\n"); 75: return; 76: } 77: printf("%u/%u mbufs in use:\n", 78: mbstat.m_mbufs - mbstat.m_mtypes[MT_FREE], mbstat.m_mbufs); 79: totmbufs = 0; 80: for (mp = mbtypes; mp->mt_name; mp++) 81: if (mbstat.m_mtypes[mp->mt_type]) { 82: seen[mp->mt_type] = YES; 83: printf("\t%u mbufs allocated to %s\n", 84: mbstat.m_mtypes[mp->mt_type], mp->mt_name); 85: totmbufs += mbstat.m_mtypes[mp->mt_type]; 86: } 87: seen[MT_FREE] = YES; 88: for (i = 0; i < nmbtypes; i++) 89: if (!seen[i] && mbstat.m_mtypes[i]) { 90: printf("\t%u mbufs allocated to <mbuf type %d>\n", 91: mbstat.m_mtypes[i], i); 92: totmbufs += mbstat.m_mtypes[i]; 93: } 94: if (totmbufs != mbstat.m_mbufs - mbstat.m_mtypes[MT_FREE]) 95: printf("*** %u mbufs missing ***\n", 96: (mbstat.m_mbufs - mbstat.m_mtypes[MT_FREE]) - totmbufs); 97: printf("%u/%u mapped pages in use\n", 98: mbstat.m_clusters - mbstat.m_clfree, mbstat.m_clusters); 99: printf("%u interface pages allocated\n", mbstat.m_space); 100: totmem = mbstat.m_mbufs * MSIZE + mbstat.m_clusters * CLBYTES + 101: mbstat.m_space * CLBYTES; 102: totfree = mbstat.m_mtypes[MT_FREE]*MSIZE + mbstat.m_clfree * CLBYTES; 103: printf("%lu Kbytes allocated to network (%ld%% in use)\n", 104: totmem / 1024, (totmem - totfree) * 100 / totmem); 105: printf("%u requests for memory denied\n", mbstat.m_drops); 106: printf("%u requests for memory delayed\n", mbstat.m_wait); 107: printf("%u calls to protocol drain routines\n", mbstat.m_drain); 108: }