5
#include <net-snmp/net-snmp-config.h>
8
* Ripped from /usr/scr/usr.bin/vmstat/vmstat.c (covering all bases)
10
#include <sys/param.h>
13
#include <sys/dkstat.h>
16
#include <sys/namei.h>
17
#include <sys/malloc.h>
18
#include <sys/signal.h>
19
#include <sys/fcntl.h>
20
#include <sys/ioctl.h>
21
#include <sys/sysctl.h>
22
#include <sys/vmmeter.h>
24
#include <vm/vm_param.h>
25
#include <vm/vm_extern.h>
40
#include <net-snmp/net-snmp-includes.h>
41
#include <net-snmp/agent/net-snmp-agent-includes.h>
42
#include <net-snmp/agent/auto_nlist.h>
44
#include "util_funcs.h"
51
#define BOOTTIME_SYMBOL "boottime"
53
FindVarMethod var_extensible_vmstat;
56
init_vmstat_bsdi4(void)
59
struct variable2 extensible_vmstat_variables[] = {
60
{MIBINDEX, ASN_INTEGER, RONLY, var_extensible_vmstat, 1,
62
{ERRORNAME, ASN_OCTET_STR, RONLY, var_extensible_vmstat, 1,
64
{SWAPIN, ASN_INTEGER, RONLY, var_extensible_vmstat, 1, {SWAPIN}},
65
{SWAPOUT, ASN_INTEGER, RONLY, var_extensible_vmstat, 1, {SWAPOUT}},
66
{IOSENT, ASN_INTEGER, RONLY, var_extensible_vmstat, 1, {IOSENT}},
67
{IORECEIVE, ASN_INTEGER, RONLY, var_extensible_vmstat, 1,
69
{SYSINTERRUPTS, ASN_INTEGER, RONLY, var_extensible_vmstat, 1,
71
{SYSCONTEXT, ASN_INTEGER, RONLY, var_extensible_vmstat, 1,
73
{CPUUSER, ASN_INTEGER, RONLY, var_extensible_vmstat, 1, {CPUUSER}},
74
{CPUSYSTEM, ASN_INTEGER, RONLY, var_extensible_vmstat, 1,
76
{CPUIDLE, ASN_INTEGER, RONLY, var_extensible_vmstat, 1, {CPUIDLE}},
77
{CPURAWUSER, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,
79
{CPURAWNICE, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,
81
{CPURAWSYSTEM, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,
83
{CPURAWIDLE, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,
85
{CPURAWKERNEL, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,
87
{CPURAWINTR, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,
93
* {ERRORFLAG, ASN_INTEGER, RONLY, var_extensible_vmstat, 1, {ERRORFLAG }},
94
* {ERRORMSG, ASN_OCTET_STR, RONLY, var_extensible_vmstat, 1, {ERRORMSG }}
99
* Define the OID pointer to the top of the mib tree that we're
100
* registering underneath
102
oid vmstat_variables_oid[] = { UCDAVIS_MIB, 11 };
105
* register ourselves with the agent to handle our mib tree
107
REGISTER_MIB("ucd-snmp/vmstat", extensible_vmstat_variables, variable2,
108
vmstat_variables_oid);
116
static time_t now, boottime;
120
auto_nlist(BOOTTIME_SYMBOL, (char *) &boottime, sizeof(boottime));
123
uptime = now - boottime;
129
var_extensible_vmstat(struct variable *vp,
133
size_t * var_len, WriteMethod ** write_method)
138
time_t time_new = getuptime();
139
static time_t time_old;
140
static time_t time_diff;
142
static long cpu_old[CPUSTATES];
143
static long cpu_new[CPUSTATES];
144
static long cpu_diff[CPUSTATES];
145
static long cpu_total;
149
static struct vmmeter mem_old, mem_new;
150
int mem_mib[] = { CTL_VM, VM_CNT };
151
int mem_size = sizeof(struct vmmeter);
152
int cpu_mib[] = { CTL_KERN, KERN_CPUSTATS };
153
int cpu_size = sizeof(struct cpustats);
155
static long long_ret;
156
static char errmsg[300];
158
long_ret = 0; /* set to 0 as default */
160
if (header_generic(vp, name, length, exact, var_len, write_method))
164
* Update structures (only if time has passed)
166
if (time_new != time_old) {
167
time_diff = time_new - time_old;
173
sysctl(cpu_mib, 2, &cpu_new, &cpu_size, NULL, 0);
177
for (loop = 0; loop < CPUSTATES; loop++) {
178
cpu_diff[loop] = cpu_new[loop] - cpu_old[loop];
179
cpu_old[loop] = cpu_new[loop];
180
cpu_total += cpu_diff[loop];
190
sysctl(mem_mib, 2, &mem_new, &mem_size, NULL, 0);
196
#define rate(x) (((x)+ time_diff/2) / time_diff)
201
#define ptok(p) ((p) * (mem_new.v_page_size >> 10))
206
return ((u_char *) (&long_ret));
207
case ERRORNAME: /* dummy name */
208
sprintf(errmsg, "systemStats");
209
*var_len = strlen(errmsg);
210
return ((u_char *) (errmsg));
212
long_ret = ptok(mem_new.v_swpin - mem_old.v_swpin);
213
long_ret = rate(long_ret);
214
return ((u_char *) (&long_ret));
216
long_ret = ptok(mem_new.v_swpout - mem_old.v_swpout);
217
long_ret = rate(long_ret);
218
return ((u_char *) (&long_ret));
224
return ((u_char *) (&long_ret));
230
return ((u_char *) (&long_ret));
232
long_ret = rate(mem_new.v_intr - mem_old.v_intr);
233
return ((u_char *) (&long_ret));
235
long_ret = rate(mem_new.v_swtch - mem_old.v_swtch);
236
return ((u_char *) (&long_ret));
238
cpu_sum = cpu_diff[CP_USER] + cpu_diff[CP_NICE];
239
cpu_prc = (float) cpu_sum / (float) cpu_total;
240
long_ret = cpu_prc * CPU_PRC;
241
return ((u_char *) (&long_ret));
243
cpu_sum = cpu_diff[CP_SYS] + cpu_diff[CP_INTR];
244
cpu_prc = (float) cpu_sum / (float) cpu_total;
245
long_ret = cpu_prc * CPU_PRC;
246
return ((u_char *) (&long_ret));
248
cpu_sum = cpu_diff[CP_IDLE];
249
cpu_prc = (float) cpu_sum / (float) cpu_total;
250
long_ret = cpu_prc * CPU_PRC;
251
return ((u_char *) (&long_ret));
253
long_ret = cpu_new[CP_USER];
254
return ((u_char *) (&long_ret));
256
long_ret = cpu_new[CP_NICE];
257
return ((u_char *) (&long_ret));
259
long_ret = cpu_new[CP_SYS] + cpu_new[CP_INTR];
260
return ((u_char *) (&long_ret));
262
long_ret = cpu_new[CP_IDLE];
263
return ((u_char *) (&long_ret));
265
long_ret = cpu_new[CP_SYS];
266
return ((u_char *) (&long_ret));
268
long_ret = cpu_new[CP_INTR];
269
return ((u_char *) (&long_ret));
271
* reserved for future use
275
* return((u_char *) (&long_ret));
277
* return((u_char *) (&long_ret));