]> git.saurik.com Git - apple/network_cmds.git/blob - netstat.tproj/mbuf.c
260f6aa1502e43d60c03522d7e06e6fcc45bccc5
[apple/network_cmds.git] / netstat.tproj / mbuf.c
1 /*
2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved.
7 *
8 * This file contains Original Code and/or Modifications of Original Code
9 * as defined in and that are subject to the Apple Public Source License
10 * Version 2.0 (the 'License'). You may not use this file except in
11 * compliance with the License. Please obtain a copy of the License at
12 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * file.
14 *
15 * The Original Code and all software distributed under the License are
16 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
17 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
18 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
20 * Please see the License for the specific language governing rights and
21 * limitations under the License.
22 *
23 * @APPLE_LICENSE_HEADER_END@
24 */
25 /*
26 * Copyright (c) 1983, 1988, 1993
27 * The Regents of the University of California. All rights reserved.
28 *
29 * Redistribution and use in source and binary forms, with or without
30 * modification, are permitted provided that the following conditions
31 * are met:
32 * 1. Redistributions of source code must retain the above copyright
33 * notice, this list of conditions and the following disclaimer.
34 * 2. Redistributions in binary form must reproduce the above copyright
35 * notice, this list of conditions and the following disclaimer in the
36 * documentation and/or other materials provided with the distribution.
37 * 3. All advertising materials mentioning features or use of this software
38 * must display the following acknowledgement:
39 * This product includes software developed by the University of
40 * California, Berkeley and its contributors.
41 * 4. Neither the name of the University nor the names of its contributors
42 * may be used to endorse or promote products derived from this software
43 * without specific prior written permission.
44 *
45 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
46 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
47 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
48 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
49 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
50 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
51 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
52 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
53 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
54 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
55 * SUCH DAMAGE.
56 */
57
58
59 #include <sys/param.h>
60 #include <sys/protosw.h>
61 #include <sys/socket.h>
62 #include <sys/mbuf.h>
63
64 #include <stdio.h>
65 #include "netstat.h"
66 #include <netat/sysglue.h> /* To get Appletalk message/mbuf types */
67
68 #define YES 1
69 typedef int bool;
70
71 struct mbstat mbstat;
72
73 static struct mbtypes {
74 int mt_type;
75 char *mt_name;
76 } mbtypes[] = {
77 { MT_DATA, "data" },
78 { MT_OOBDATA, "oob data" },
79 { MT_CONTROL, "ancillary data" },
80 { MT_HEADER, "packet headers" },
81 { MT_SOCKET, "socket structures" }, /* XXX */
82 { MT_PCB, "protocol control blocks" }, /* XXX */
83 { MT_RTABLE, "routing table entries" }, /* XXX */
84 { MT_HTABLE, "IMP host table entries" }, /* XXX */
85 { MT_ATABLE, "address resolution tables" },
86 { MT_FTABLE, "fragment reassembly queue headers" }, /* XXX */
87 { MT_SONAME, "socket names and addresses" },
88 { MT_SOOPTS, "socket options" },
89 { MT_RIGHTS, "access rights" },
90 { MT_IFADDR, "interface addresses" }, /* XXX */
91 { MSG_DATA, "Appletalk data blocks"},
92 { MSG_PROTO, "Appletalk internal msgs"},
93 { MSG_IOCTL, "Appletalk ioctl requests"},
94 { MSG_ERROR, "Appletalk error indicators"},
95 { MSG_HANGUP, "Appletalk termination requests"},
96 { MSG_IOCACK, "Appletalk ioctl acks"},
97 { MSG_IOCNAK, "Appletalk ioctl failure indicators"},
98 { MSG_CTL, "Appletalk control msgs"},
99 { 0, 0 }
100 };
101
102 int nmbtypes = sizeof(mbstat.m_mtypes) / sizeof(short);
103 bool seen[256]; /* "have we seen this type yet?" */
104
105 /*
106 * Print mbuf statistics.
107 */
108 void
109 mbpr(mbaddr)
110 u_long mbaddr;
111 {
112 register int totmem, totfree, totmbufs;
113 register int i;
114 register struct mbtypes *mp;
115
116 if (nmbtypes != 256) {
117 fprintf(stderr,
118 "netstat: unexpected change to mbstat; check source\n");
119 return;
120 }
121 if (mbaddr == 0) {
122 fprintf(stderr, "netstat: mbstat: symbol not in namelist\n");
123 return;
124 }
125 if (kread(mbaddr, (char *)&mbstat, sizeof (mbstat)))
126 return;
127
128 totmbufs = 0;
129 for (mp = mbtypes; mp->mt_name; mp++)
130 totmbufs += mbstat.m_mtypes[mp->mt_type];
131 printf("%u mbufs in use:\n", totmbufs);
132 for (mp = mbtypes; mp->mt_name; mp++)
133 if (mbstat.m_mtypes[mp->mt_type]) {
134 seen[mp->mt_type] = YES;
135 printf("\t%u mbufs allocated to %s\n",
136 mbstat.m_mtypes[mp->mt_type], mp->mt_name);
137 }
138 seen[MT_FREE] = YES;
139 for (i = 0; i < nmbtypes; i++)
140 if (!seen[i] && mbstat.m_mtypes[i]) {
141 printf("\t%u mbufs allocated to <mbuf type %d>\n",
142 mbstat.m_mtypes[i], i);
143 }
144 printf("%u/%u mbuf clusters in use\n",
145 (unsigned int)(mbstat.m_clusters - mbstat.m_clfree),
146 (unsigned int)mbstat.m_clusters);
147 totmem = totmbufs * MSIZE + mbstat.m_clusters * MCLBYTES;
148 totfree = mbstat.m_clfree * MCLBYTES;
149 printf("%u Kbytes allocated to network (%d%% in use)\n",
150 totmem / 1024, (totmem - totfree) * 100 / totmem);
151 printf("%u requests for memory denied\n",
152 (unsigned int)mbstat.m_drops);
153 printf("%u requests for memory delayed\n", (unsigned int)mbstat.m_wait);
154 printf("%u calls to protocol drain routines\n",
155 (unsigned int)mbstat.m_drain);
156 }