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 #if defined(HAVE_UVM_UVM_PARAM_H) && defined(HAVE_UVM_UVM_EXTERN_H)
25 #include <uvm/uvm_param.h>
26 #include <uvm/uvm_extern.h>
27 #elif defined(HAVE_VM_VM_PARAM_H) && defined(HAVE_VM_VM_EXTERN_H)
28 #include <vm/vm_param.h>
29 #include <vm/vm_extern.h>
31 #error memory_netbsd1.c: Is this really a NetBSD system?
50 #include <net-snmp/net-snmp-includes.h>
51 #include <net-snmp/agent/net-snmp-agent-includes.h>
52 #include <net-snmp/agent/auto_nlist.h>
54 #include "util_funcs.h"
56 #include "memory_netbsd1.h"
59 * Default swap warning limit (kb)
61 #define DEFAULTMINIMUMSWAP 16000
75 static FindVarMethod var_extensible_mem;
78 init_memory_netbsd1(void)
81 struct variable2 extensible_mem_variables[] = {
82 {MIBINDEX, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MIBINDEX}},
83 {ERRORNAME, ASN_OCTET_STR, RONLY, var_extensible_mem, 1,
85 {MEMTOTALSWAP, ASN_INTEGER, RONLY, var_extensible_mem, 1,
87 {MEMAVAILSWAP, ASN_INTEGER, RONLY, var_extensible_mem, 1,
89 {MEMTOTALREAL, ASN_INTEGER, RONLY, var_extensible_mem, 1,
91 {MEMAVAILREAL, ASN_INTEGER, RONLY, var_extensible_mem, 1,
93 {MEMTOTALSWAPTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1,
95 {MEMUSEDSWAPTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1,
97 {MEMTOTALREALTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1,
99 {MEMUSEDREALTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1,
101 {MEMTOTALFREE, ASN_INTEGER, RONLY, var_extensible_mem, 1,
103 {MEMSWAPMINIMUM, ASN_INTEGER, RONLY, var_extensible_mem, 1,
105 {MEMSHARED, ASN_INTEGER, RONLY, var_extensible_mem, 1,
107 {MEMBUFFER, ASN_INTEGER, RONLY, var_extensible_mem, 1,
109 {MEMCACHED, ASN_INTEGER, RONLY, var_extensible_mem, 1,
111 {ERRORFLAG, ASN_INTEGER, RONLY, var_extensible_mem, 1,
113 {ERRORMSG, ASN_OCTET_STR, RONLY, var_extensible_mem, 1, {ERRORMSG}}
117 * Define the OID pointer to the top of the mib tree that we're
118 * registering underneath
120 oid mem_variables_oid[] = { UCDAVIS_MIB, MEMMIBNUM };
123 * register ourselves with the agent to handle our mib tree
125 REGISTER_MIB("ucd-snmp/memory", extensible_mem_variables, variable2,
128 snmpd_register_config_handler("swap", memory_parse_config,
129 memory_free_config, "min-avail");
134 memory_parse_config(const char *token, char *cptr)
136 minimumswap = atoi(cptr);
140 memory_free_config(void)
142 minimumswap = DEFAULTMINIMUMSWAP;
147 * var_extensible_mem(...
149 * vp IN - pointer to variable entry that points here
150 * name IN/OUT - IN/name requested, OUT/name found
151 * length IN/OUT - length of IN/OUT oid's
152 * exact IN - TRUE if an exact match was requested
153 * var_len OUT - length of variable or 0 if function returned
160 var_extensible_mem(struct variable *vp,
164 size_t * var_len, WriteMethod ** write_method)
166 static long long_ret;
167 static char errmsg[300];
169 static struct uvmexp uvmexp;
170 int uvmexp_size = sizeof(uvmexp);
171 int uvmexp_mib[] = { CTL_VM, VM_UVMEXP };
172 static struct vmtotal total;
173 size_t total_size = sizeof(total);
174 int total_mib[] = { CTL_VM, VM_METER };
177 size_t phys_mem_size = sizeof(phys_mem);
178 int phys_mem_mib[] = { CTL_HW, HW_USERMEM };
180 if (header_generic(vp, name, length, exact, var_len, write_method))
186 sysctl(uvmexp_mib, 2, &uvmexp, &uvmexp_size, NULL, 0);
187 sysctl(total_mib, 2, &total, &total_size, NULL, 0);
192 sysctl(phys_mem_mib, 2, &phys_mem, &phys_mem_size, NULL, 0);
194 long_ret = 0; /* set to 0 as default */
199 #define ptok(p) ((p) * (uvmexp.pagesize >> 10))
204 return ((u_char *) (&long_ret));
205 case ERRORNAME: /* dummy name */
206 sprintf(errmsg, "swap");
207 *var_len = strlen(errmsg);
208 return ((u_char *) (errmsg));
210 long_ret = ptok(uvmexp.swpages);
211 return ((u_char *) (&long_ret));
212 case MEMAVAILSWAP: /* FREE swap memory */
213 long_ret = ptok(uvmexp.swpages - uvmexp.swpginuse);
214 return ((u_char *) (&long_ret));
216 long_ret = phys_mem >> 10;
217 return ((u_char *) (&long_ret));
218 case MEMAVAILREAL: /* FREE real memory */
219 long_ret = ptok(uvmexp.free);
220 return ((u_char *) (&long_ret));
223 * these are not implemented
225 case MEMTOTALSWAPTXT:
227 case MEMTOTALREALTXT:
233 return ((u_char *) (&long_ret));
236 long_ret = ptok((int) total.t_free);
237 return ((u_char *) (&long_ret));
239 long_ret = minimumswap;
240 return ((u_char *) (&long_ret));
242 return ((u_char *) (&long_ret));
248 long_ret = (swapFree > minimumswap) ? 0 : 1;
249 return ((u_char *) (&long_ret));
251 if (swapFree < minimumswap)
252 sprintf(errmsg, "Running out of swap space (%qd)", swapFree);
255 *var_len = strlen(errmsg);
256 return ((u_char *) (errmsg));