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>
23 #include <sys/sched.h>
25 #if defined(HAVE_UVM_UVM_PARAM_H) && defined(HAVE_UVM_UVM_EXTERN_H)
26 #include <uvm/uvm_param.h>
27 #include <uvm/uvm_extern.h>
28 #elif defined(HAVE_VM_VM_PARAM_H) && defined(HAVE_VM_VM_EXTERN_H)
29 #include <vm/vm_param.h>
30 #include <vm/vm_extern.h>
32 #error vmstat_netbsd1.c: Is this really a NetBSD system?
48 #include <net-snmp/net-snmp-includes.h>
49 #include <net-snmp/agent/net-snmp-agent-includes.h>
50 #include <net-snmp/agent/auto_nlist.h>
52 #include "util_funcs.h"
59 #define CPTIME_SYMBOL "cp_time"
60 #define BOOTTIME_SYMBOL "boottime"
62 FindVarMethod var_extensible_vmstat;
65 init_vmstat_netbsd1(void)
68 struct variable2 extensible_vmstat_variables[] = {
69 {MIBINDEX, ASN_INTEGER, RONLY, var_extensible_vmstat, 1,
71 {ERRORNAME, ASN_OCTET_STR, RONLY, var_extensible_vmstat, 1,
73 {SWAPIN, ASN_INTEGER, RONLY, var_extensible_vmstat, 1, {SWAPIN}},
74 {SWAPOUT, ASN_INTEGER, RONLY, var_extensible_vmstat, 1, {SWAPOUT}},
75 {IOSENT, ASN_INTEGER, RONLY, var_extensible_vmstat, 1, {IOSENT}},
76 {IORECEIVE, ASN_INTEGER, RONLY, var_extensible_vmstat, 1,
78 {SYSINTERRUPTS, ASN_INTEGER, RONLY, var_extensible_vmstat, 1,
80 {SYSCONTEXT, ASN_INTEGER, RONLY, var_extensible_vmstat, 1,
82 {CPUUSER, ASN_INTEGER, RONLY, var_extensible_vmstat, 1, {CPUUSER}},
83 {CPUSYSTEM, ASN_INTEGER, RONLY, var_extensible_vmstat, 1,
85 {CPUIDLE, ASN_INTEGER, RONLY, var_extensible_vmstat, 1, {CPUIDLE}},
86 {CPURAWUSER, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,
88 {CPURAWNICE, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,
90 {CPURAWSYSTEM, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,
92 {CPURAWIDLE, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,
94 {CPURAWKERNEL, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,
96 {CPURAWINTR, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,
103 * {ERRORFLAG, ASN_INTEGER, RONLY, var_extensible_vmstat, 1, {ERRORFLAG }},
104 * {ERRORMSG, ASN_OCTET_STR, RONLY, var_extensible_vmstat, 1, {ERRORMSG }}
109 * Define the OID pointer to the top of the mib tree that we're
110 * registering underneath
112 oid vmstat_variables_oid[] = { UCDAVIS_MIB, 11 };
115 * register ourselves with the agent to handle our mib tree
117 REGISTER_MIB("ucd-snmp/vmstat", extensible_vmstat_variables, variable2,
118 vmstat_variables_oid);
126 static time_t now, boottime;
130 auto_nlist(BOOTTIME_SYMBOL, (char *) &boottime, sizeof(boottime));
133 uptime = now - boottime;
139 var_extensible_vmstat(struct variable *vp,
143 size_t * var_len, WriteMethod ** write_method)
148 time_t time_new = getuptime();
149 static time_t time_old;
150 static time_t time_diff;
152 #if defined(KERN_CP_TIME)
153 static u_int64_t cpu_old[CPUSTATES];
154 static u_int64_t cpu_new[CPUSTATES];
155 static u_int64_t cpu_diff[CPUSTATES];
156 static u_int64_t cpu_total;
157 #elif defined(KERN_CPTIME)
158 static long cpu_old[CPUSTATES];
159 static long cpu_new[CPUSTATES];
160 static long cpu_diff[CPUSTATES];
161 static long cpu_total;
163 static long cpu_old[CPUSTATES];
164 static long cpu_new[CPUSTATES];
165 static long cpu_diff[CPUSTATES];
166 static long cpu_total;
171 static struct uvmexp mem_old, mem_new;
172 int mem_mib[] = { CTL_VM, VM_UVMEXP };
173 int mem_size = sizeof(struct uvmexp);
175 static long long_ret;
176 static char errmsg[300];
178 long_ret = 0; /* set to 0 as default */
180 if (header_generic(vp, name, length, exact, var_len, write_method))
184 * Update structures (only if time has passed)
186 if (time_new != time_old) {
188 int mib[2] = { CTL_KERN, KERN_CP_TIME };
189 int ssize = sizeof(cpu_new);
191 if (sysctl(mib, 2, cpu_new, &ssize, NULL, 0) < 0)
192 memset(cpu_new, 0, sizeof(cpu_new));
193 #elif defined(KERN_CPTIME)
194 int mib[2] = { CTL_KERN, KERN_CPTIME };
195 int ssize = sizeof(cpu_new);
197 if (sysctl(mib, 2, cpu_new, &ssize, NULL, 0) < 0)
198 memset(cpu_new, 0, sizeof(cpu_new));
203 auto_nlist(CPTIME_SYMBOL, (char *) cpu_new, sizeof(cpu_new));
206 time_diff = time_new - time_old;
211 for (loop = 0; loop < CPUSTATES; loop++) {
212 cpu_diff[loop] = cpu_new[loop] - cpu_old[loop];
213 cpu_old[loop] = cpu_new[loop];
214 cpu_total += cpu_diff[loop];
224 sysctl(mem_mib, 2, &mem_new, &mem_size, NULL, 0);
230 #define rate(x) (((x)+ time_diff/2) / time_diff)
235 #define ptok(p) ((p) * (mem_new.pagesize >> 10))
240 return ((u_char *) (&long_ret));
241 case ERRORNAME: /* dummy name */
242 sprintf(errmsg, "systemStats");
243 *var_len = strlen(errmsg);
244 return ((u_char *) (errmsg));
246 long_ret = ptok(mem_new.swapins - mem_old.swapins);
247 long_ret = rate(long_ret);
248 return ((u_char *) (&long_ret));
250 long_ret = ptok(mem_new.swapouts - mem_old.swapouts);
251 long_ret = rate(long_ret);
252 return ((u_char *) (&long_ret));
258 return ((u_char *) (&long_ret));
264 return ((u_char *) (&long_ret));
266 long_ret = rate(mem_new.intrs - mem_old.intrs);
267 return ((u_char *) (&long_ret));
269 long_ret = rate(mem_new.swtch - mem_old.swtch);
270 return ((u_char *) (&long_ret));
272 cpu_sum = cpu_diff[CP_USER] + cpu_diff[CP_NICE];
273 cpu_prc = (float) cpu_sum / (float) cpu_total;
274 long_ret = cpu_prc * CPU_PRC;
275 return ((u_char *) (&long_ret));
277 cpu_sum = cpu_diff[CP_SYS] + cpu_diff[CP_INTR];
278 cpu_prc = (float) cpu_sum / (float) cpu_total;
279 long_ret = cpu_prc * CPU_PRC;
280 return ((u_char *) (&long_ret));
282 cpu_sum = cpu_diff[CP_IDLE];
283 cpu_prc = (float) cpu_sum / (float) cpu_total;
284 long_ret = cpu_prc * CPU_PRC;
285 return ((u_char *) (&long_ret));
287 long_ret = cpu_new[CP_USER];
288 return ((u_char *) (&long_ret));
290 long_ret = cpu_new[CP_NICE];
291 return ((u_char *) (&long_ret));
293 long_ret = cpu_new[CP_SYS] + cpu_new[CP_INTR];
294 return ((u_char *) (&long_ret));
296 long_ret = cpu_new[CP_IDLE];
297 return ((u_char *) (&long_ret));
299 long_ret = cpu_new[CP_SYS];
300 return ((u_char *) (&long_ret));
302 long_ret = cpu_new[CP_INTR];
303 return ((u_char *) (&long_ret));
305 * reserved for future use
309 * return((u_char *) (&long_ret));
311 * return((u_char *) (&long_ret));