summaryrefslogtreecommitdiff
path: root/agent/mibgroup/hardware/cpu/cpu_nlist.c
diff options
context:
space:
mode:
Diffstat (limited to 'agent/mibgroup/hardware/cpu/cpu_nlist.c')
-rw-r--r--agent/mibgroup/hardware/cpu/cpu_nlist.c112
1 files changed, 112 insertions, 0 deletions
diff --git a/agent/mibgroup/hardware/cpu/cpu_nlist.c b/agent/mibgroup/hardware/cpu/cpu_nlist.c
new file mode 100644
index 0000000..974028a
--- /dev/null
+++ b/agent/mibgroup/hardware/cpu/cpu_nlist.c
@@ -0,0 +1,112 @@
+/*
+ * nlist() interface
+ * e.g. FreeBSD
+ */
+#include <net-snmp/net-snmp-config.h>
+#include <net-snmp/net-snmp-features.h>
+#include <net-snmp/net-snmp-includes.h>
+#include <net-snmp/agent/net-snmp-agent-includes.h>
+#include <net-snmp/agent/hardware/cpu.h>
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/resource.h>
+
+#ifdef HAVE_SYS_DKSTAT_H
+#include <sys/dkstat.h>
+#endif
+#ifdef HAVE_SYS_SYSCTL_H
+#include <sys/sysctl.h>
+#endif
+#ifdef HAVE_SYS_VMMETER_H
+#include <sys/vmmeter.h>
+#endif
+#ifdef HAVE_VM_VM_PARAM_H
+#include <vm/vm_param.h>
+#endif
+#ifdef HAVE_VM_VM_EXTERN_H
+#include <vm/vm_extern.h>
+#endif
+
+#define CPU_SYMBOL "cp_time"
+#define MEM_SYMBOL "cnt"
+
+netsnmp_feature_require(hardware_cpu_copy_stats)
+void _cpu_copy_stats( netsnmp_cpu_info *cpu );
+
+ /*
+ * Initialise the list of CPUs on the system
+ * (including descriptions)
+ */
+void init_cpu_nlist( void ) {
+ int n;
+ size_t i;
+ int ncpu_mib[] = { CTL_HW, HW_NCPU };
+ int model_mib[] = { CTL_HW, HW_MODEL };
+ char descr[ SNMP_MAXBUF ];
+ netsnmp_cpu_info *cpu = netsnmp_cpu_get_byIdx( -1, 1 );
+ strcpy(cpu->name, "Overall CPU statistics");
+
+ i = sizeof(n);
+ sysctl(ncpu_mib, 2, &n, &i, NULL, 0);
+ i = sizeof(descr);
+ sysctl(model_mib, 2, descr, &i, NULL, 0);
+
+ if ( n <= 0 )
+ n = 1; /* Single CPU system */
+ for ( i=0; i<n; i++ ) {
+ cpu = netsnmp_cpu_get_byIdx( i, 1 );
+ cpu->status = 2; /* running */
+ sprintf(cpu->name, "cpu%d", i);
+ sprintf(cpu->descr, "%s", descr);
+ }
+ cpu_num = n;
+}
+
+
+ /*
+ * Load the latest CPU usage statistics
+ */
+int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
+ long cpu_stats[CPUSTATES];
+ struct vmmeter mem_stats;
+ netsnmp_cpu_info *cpu = netsnmp_cpu_get_byIdx( -1, 0 );
+
+ auto_nlist( CPU_SYMBOL, (char *) cpu_stats, sizeof(cpu_stats));
+ auto_nlist( MEM_SYMBOL, (char *)&mem_stats, sizeof(mem_stats));
+
+ cpu->user_ticks = (unsigned long long)cpu_stats[CP_USER];
+ cpu->nice_ticks = (unsigned long long)cpu_stats[CP_NICE];
+ cpu->sys2_ticks = (unsigned long long)cpu_stats[CP_SYS]+cpu_stats[CP_INTR];
+ cpu->idle_ticks = (unsigned long long)cpu_stats[CP_IDLE];
+ cpu->kern_ticks = (unsigned long long)cpu_stats[CP_SYS];
+ cpu->intrpt_ticks = (unsigned long long)cpu_stats[CP_INTR];
+ /* wait_ticks, sirq_ticks unused */
+
+ /*
+ * Interrupt/Context Switch statistics
+ * XXX - Do these really belong here ?
+ */
+#if defined(openbsd2) || defined(darwin)
+ cpu->swapIn = (unsigned long long)mem_stats.v_swpin;
+ cpu->swapOut = (unsigned long long)mem_stats.v_swpout;
+#else
+ cpu->swapIn = (unsigned long long)mem_stats.v_swappgsin+mem_stats.v_vnodepgsin;
+ cpu->swapOut = (unsigned long long)mem_stats.v_swappgsout+mem_stats.v_vnodepgsout;
+#endif
+ cpu->nInterrupts = (unsigned long long)mem_stats.v_intr;
+ cpu->nCtxSwitches = (unsigned long long)mem_stats.v_swtch;
+
+#ifdef PER_CPU_INFO
+ for ( i = 0; i < n; i++ ) {
+ cpu = netsnmp_cpu_get_byIdx( i, 0 );
+ /* XXX - per-CPU statistics */
+ }
+#else
+ /* Copy "overall" figures to cpu0 entry */
+ _cpu_copy_stats( cpu );
+#endif
+
+ return 0;
+}