summaryrefslogtreecommitdiff
path: root/agent/mibgroup/hardware/memory/memory_netbsd.c
diff options
context:
space:
mode:
Diffstat (limited to 'agent/mibgroup/hardware/memory/memory_netbsd.c')
-rw-r--r--agent/mibgroup/hardware/memory/memory_netbsd.c139
1 files changed, 139 insertions, 0 deletions
diff --git a/agent/mibgroup/hardware/memory/memory_netbsd.c b/agent/mibgroup/hardware/memory/memory_netbsd.c
new file mode 100644
index 0000000..746fea0
--- /dev/null
+++ b/agent/mibgroup/hardware/memory/memory_netbsd.c
@@ -0,0 +1,139 @@
+#include <net-snmp/net-snmp-config.h>
+#include <net-snmp/net-snmp-includes.h>
+#include <net-snmp/agent/net-snmp-agent-includes.h>
+#include <net-snmp/agent/hardware/memory.h>
+
+#include <unistd.h>
+#include <sys/sysctl.h>
+#include <sys/swap.h>
+
+#if defined(HAVE_UVM_UVM_PARAM_H) && defined(HAVE_UVM_UVM_EXTERN_H)
+#include <uvm/uvm_param.h>
+#include <uvm/uvm_extern.h>
+#elif defined(HAVE_VM_VM_PARAM_H) && defined(HAVE_VM_VM_EXTERN_H)
+#include <vm/vm_param.h>
+#include <vm/vm_extern.h>
+#else
+#error memory_netbsd1.c: Is this really a NetBSD system?
+#endif
+
+#ifdef SWAP_NSWAP
+void swapinfo(long);
+#endif
+
+ /*
+ * Load the latest memory usage statistics
+ */
+int netsnmp_mem_arch_load( netsnmp_cache *cache, void *magic ) {
+
+ netsnmp_memory_info *mem;
+ long pagesize;
+
+ struct uvmexp uvmexp;
+ int uvmexp_size = sizeof(uvmexp);
+ int uvmexp_mib[] = { CTL_VM, VM_UVMEXP };
+
+ struct vmtotal total;
+ size_t total_size = sizeof(total);
+ int total_mib[] = { CTL_VM, VM_METER };
+
+ long phys_mem;
+ long user_mem;
+ size_t mem_size = sizeof(phys_mem);
+ int phys_mem_mib[] = { CTL_HW, HW_PHYSMEM };
+ int user_mem_mib[] = { CTL_HW, HW_USERMEM };
+
+ /*
+ * Retrieve the memory information from the underlying O/S...
+ */
+ sysctl(uvmexp_mib, 2, &uvmexp, &uvmexp_size, NULL, 0);
+ sysctl(total_mib, 2, &total, &total_size, NULL, 0);
+ sysctl(phys_mem_mib, 2, &phys_mem, &mem_size, NULL, 0);
+ sysctl(user_mem_mib, 2, &user_mem, &mem_size, NULL, 0);
+ pagesize = uvmexp.pagesize;
+
+ /*
+ * ... and save this in a standard form.
+ */
+ mem = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_PHYSMEM, 1 );
+ if (!mem) {
+ snmp_log_perror("No Physical Memory info entry");
+ } else {
+ if (!mem->descr)
+ mem->descr = strdup("Physical memory");
+ mem->units = pagesize;
+ mem->size = phys_mem/pagesize;
+ mem->free = total.t_free;
+ mem->other = -1;
+ }
+
+ mem = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_USERMEM, 1 );
+ if (!mem) {
+ snmp_log_perror("No (user) Memory info entry");
+ } else {
+ if (!mem->descr)
+ mem->descr = strdup("Real memory");
+ mem->units = pagesize;
+ mem->size = user_mem/pagesize;
+ mem->free = uvmexp.free;
+ mem->other = -1;
+ }
+
+#ifdef SWAP_NSWAP
+ swapinfo(pagesize);
+#endif
+ mem = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_SWAP, 1 );
+ if (!mem) {
+ snmp_log_perror("No Swap info entry");
+ } else {
+ if (!mem->descr)
+ mem->descr = strdup("Swap space");
+ mem->units = pagesize;
+ mem->size = uvmexp.swpages;
+ mem->free = uvmexp.swpages - uvmexp.swpginuse;
+ mem->other = -1;
+ }
+
+ return 0;
+}
+
+
+#ifdef SWAP_NSWAP
+ /*
+ * If there are multiple swap devices, record
+ * the statistics for each one individually.
+ */
+void
+swapinfo(long pagesize)
+{
+ int i, n;
+ struct swapent *s;
+ netsnmp_memory_info *mem;
+ char buf[1024];
+
+ /*
+ * If there's only one swap device, don't bother
+ */
+ n = swapctl( SWAP_NSWAP, NULL, 0 );
+ if ( n <= 1 )
+ return;
+
+ s = (struct swapent*)calloc(n, sizeof(struct swapent));
+ swapctl( SWAP_STATS, s, n );
+
+ for (i = 0; i < n; ++i) {
+ mem = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_SWAP+1+i, 1 );
+ if (!mem)
+ continue;
+ if (!mem->descr) {
+ /* sprintf(buf, "swap #%d", s[i].se_dev); */
+ sprintf(buf, "swap %s", s[i].se_path);
+ mem->descr = strdup( buf );
+ }
+ mem->units = pagesize;
+ mem->size = s[i].se_nblks;
+ mem->free = s[i].se_nblks - s[i].se_inuse;
+ mem->other = -1;
+ }
+}
+#endif