121989Sdist /*
2*62145Sbostic * Copyright (c) 1983, 1988, 1993
3*62145Sbostic * The Regents of the University of California. All rights reserved.
433451Skarels *
542748Sbostic * %sccs.include.redist.c%
621989Sdist */
721989Sdist
87908Ssam #ifndef lint
9*62145Sbostic static char sccsid[] = "@(#)mbuf.c 8.1 (Berkeley) 06/06/93";
1034902Sbostic #endif /* not lint */
117908Ssam
129568Ssam #include <sys/param.h>
1353698Ssklower #include <sys/protosw.h>
1453698Ssklower #include <sys/socket.h>
157908Ssam #include <sys/mbuf.h>
1653698Ssklower
1753698Ssklower #include <stdio.h>
1853698Ssklower #include "netstat.h"
1953698Ssklower
2018594Skupfer #define YES 1
2118594Skupfer typedef int bool;
227908Ssam
237908Ssam struct mbstat mbstat;
247908Ssam
259837Ssam static struct mbtypes {
269837Ssam int mt_type;
279837Ssam char *mt_name;
289837Ssam } mbtypes[] = {
299837Ssam { MT_DATA, "data" },
3039217Skarels { MT_OOBDATA, "oob data" },
3139217Skarels { MT_CONTROL, "ancillary data" },
329837Ssam { MT_HEADER, "packet headers" },
3339217Skarels { MT_SOCKET, "socket structures" }, /* XXX */
3439217Skarels { MT_PCB, "protocol control blocks" }, /* XXX */
3539217Skarels { MT_RTABLE, "routing table entries" }, /* XXX */
3639217Skarels { MT_HTABLE, "IMP host table entries" }, /* XXX */
379837Ssam { MT_ATABLE, "address resolution tables" },
3839217Skarels { MT_FTABLE, "fragment reassembly queue headers" }, /* XXX */
399837Ssam { MT_SONAME, "socket names and addresses" },
409837Ssam { MT_SOOPTS, "socket options" },
4117232Ssam { MT_RIGHTS, "access rights" },
4253698Ssklower { MT_IFADDR, "interface addresses" }, /* XXX */
439837Ssam { 0, 0 }
449837Ssam };
459837Ssam
4618594Skupfer int nmbtypes = sizeof(mbstat.m_mtypes) / sizeof(short);
4718594Skupfer bool seen[256]; /* "have we seen this type yet?" */
4818594Skupfer
497908Ssam /*
507908Ssam * Print mbuf statistics.
517908Ssam */
5253698Ssklower void
mbpr(mbaddr)537908Ssam mbpr(mbaddr)
5454761Ssklower u_long mbaddr;
557908Ssam {
569837Ssam register int totmem, totfree, totmbufs;
5718594Skupfer register int i;
589837Ssam register struct mbtypes *mp;
599568Ssam
6018594Skupfer if (nmbtypes != 256) {
6153698Ssklower fprintf(stderr,
6253698Ssklower "%s: unexpected change to mbstat; check source\n", prog);
6318594Skupfer return;
6418594Skupfer }
657908Ssam if (mbaddr == 0) {
6653698Ssklower fprintf(stderr, "%s: mbstat: symbol not in namelist\n", prog);
677908Ssam return;
687908Ssam }
6953698Ssklower if (kread(mbaddr, (char *)&mbstat, sizeof (mbstat)))
709568Ssam return;
719837Ssam totmbufs = 0;
729837Ssam for (mp = mbtypes; mp->mt_name; mp++)
7339217Skarels totmbufs += mbstat.m_mtypes[mp->mt_type];
7439217Skarels printf("%u mbufs in use:\n", totmbufs);
7539217Skarels for (mp = mbtypes; mp->mt_name; mp++)
769837Ssam if (mbstat.m_mtypes[mp->mt_type]) {
7718594Skupfer seen[mp->mt_type] = YES;
7830451Skarels printf("\t%u mbufs allocated to %s\n",
7918594Skupfer mbstat.m_mtypes[mp->mt_type], mp->mt_name);
809837Ssam }
8118594Skupfer seen[MT_FREE] = YES;
8218594Skupfer for (i = 0; i < nmbtypes; i++)
8318594Skupfer if (!seen[i] && mbstat.m_mtypes[i]) {
8430451Skarels printf("\t%u mbufs allocated to <mbuf type %d>\n",
8518594Skupfer mbstat.m_mtypes[i], i);
8618594Skupfer }
8730451Skarels printf("%u/%u mapped pages in use\n",
889568Ssam mbstat.m_clusters - mbstat.m_clfree, mbstat.m_clusters);
8946165Skarels totmem = totmbufs * MSIZE + mbstat.m_clusters * MCLBYTES;
9046165Skarels totfree = mbstat.m_clfree * MCLBYTES;
9130451Skarels printf("%u Kbytes allocated to network (%d%% in use)\n",
929576Ssam totmem / 1024, (totmem - totfree) * 100 / totmem);
9330451Skarels printf("%u requests for memory denied\n", mbstat.m_drops);
9430451Skarels printf("%u requests for memory delayed\n", mbstat.m_wait);
9530451Skarels printf("%u calls to protocol drain routines\n", mbstat.m_drain);
967908Ssam }
97