summaryrefslogtreecommitdiff
path: root/agent/mibgroup/hardware/cpu/cpu_pstat.c
diff options
context:
space:
mode:
Diffstat (limited to 'agent/mibgroup/hardware/cpu/cpu_pstat.c')
-rw-r--r--agent/mibgroup/hardware/cpu/cpu_pstat.c109
1 files changed, 109 insertions, 0 deletions
diff --git a/agent/mibgroup/hardware/cpu/cpu_pstat.c b/agent/mibgroup/hardware/cpu/cpu_pstat.c
new file mode 100644
index 0000000..35c1d63
--- /dev/null
+++ b/agent/mibgroup/hardware/cpu/cpu_pstat.c
@@ -0,0 +1,109 @@
+/*
+ * pstat() interface
+ * e.g. HP-UX
+ */
+#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/cpu.h>
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+
+#include <sys/pstat.h>
+#include <sys/dk.h>
+
+
+ /*
+ * Initialise the list of CPUs on the system
+ * (including descriptions)
+ */
+void init_cpu_pstat( void ) {
+ int i, cpuversion;
+ struct pst_dynamic psd;
+ char descr[ SNMP_MAXBUF ];
+ netsnmp_cpu_info *cpu = netsnmp_cpu_get_byIdx( -1, 1 );
+ strcpy(cpu->name, "Overall CPU statistics");
+
+#ifdef _SC_CPU_VERSION
+ cpuversion = sysconf( _SC_CPU_VERSION );
+ switch (cpuversion) {
+ case CPU_HP_MC68020:
+ snprintf(descr, SNMP_MAXBUF, " Motorola MC68020 ");
+ case CPU_HP_MC68030:
+ snprintf(descr, SNMP_MAXBUF, " Motorola MC68030 ");
+ case CPU_HP_MC68040:
+ snprintf(descr, SNMP_MAXBUF, " Motorola MC68040 ");
+ case CPU_PA_RISC1_0:
+ snprintf(descr, SNMP_MAXBUF, " HP PA-RISC 1.0 ");
+ case CPU_PA_RISC1_1:
+ snprintf(descr, SNMP_MAXBUF, " HP PA-RISC 1.1 ");
+ case CPU_PA_RISC1_2:
+ snprintf(descr, SNMP_MAXBUF, " HP PA-RISC 1.2 ");
+ case CPU_PA_RISC2_0:
+ snprintf(descr, SNMP_MAXBUF, " HP PA-RISC 2.0 ");
+ default:
+ snprintf(descr, SNMP_MAXBUF, "An electronic chip with an HP label");
+ }
+#else
+ snprintf(descr, SNMP_MAXBUF, "An electronic chip without(?) an HP label");
+#endif
+
+ if (pstat_getdynamic(&psd, sizeof(psd), 1, 0) > 0) {
+ for ( i = 0; i < psd.psd_proc_cnt; i++ ) {
+ cpu = netsnmp_cpu_get_byIdx( i, 1 );
+ sprintf( cpu->name, "cpu%d", i );
+ sprintf( cpu->descr, descr );
+ }
+ }
+ cpu_num = psd.psd_proc_cnt;
+}
+
+
+ /*
+ * Load the latest CPU usage statistics
+ */
+int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
+ int i;
+ struct pst_dynamic psd;
+ struct pst_vminfo psv;
+ netsnmp_cpu_info *cpu = netsnmp_cpu_get_byIdx( -1, 0 );
+
+ pstat_getdynamic(&psd, sizeof(psd), 1, 0);
+ /* XXX - Compare cpu_num against psd.psd_proc_cnt */
+ cpu->user_ticks = (unsigned long long)psd.psd_cpu_time[CP_USER];
+ cpu->nice_ticks = (unsigned long long)psd.psd_cpu_time[CP_NICE];
+ cpu->sys2_ticks = (unsigned long long)psd.psd_cpu_time[CP_SYS]+
+ psd.psd_cpu_time[CP_WAIT];
+ cpu->idle_ticks = (unsigned long long)psd.psd_cpu_time[CP_IDLE];
+ cpu->wait_ticks = (unsigned long long)psd.psd_cpu_time[CP_WAIT];
+ cpu->kern_ticks = (unsigned long long)psd.psd_cpu_time[CP_SYS];
+ /* XXX - record (sum of) "all other ticks" */
+ /* intrpt_ticks, sirq_ticks unused */
+
+ /*
+ * Interrupt/Context Switch statistics
+ * XXX - Do these really belong here ?
+ */
+ pstat_getvminfo(&psv, sizeof(psv), 1, 0);
+ cpu->swapIn = (unsigned long long)psv.psv_sswpin;
+ cpu->swapOut = (unsigned long long)psv.psv_sswpout;
+ cpu->nInterrupts = (unsigned long long)psv.psv_sintr;
+ cpu->nCtxSwitches = (unsigned long long)psv.psv_sswtch;
+
+
+ for ( i = 0; i < psd.psd_proc_cnt; i++ ) {
+ cpu = netsnmp_cpu_get_byIdx( i, 0 );
+ cpu->user_ticks = (unsigned long long)psd.psd_mp_cpu_time[i][CP_USER];
+ cpu->nice_ticks = (unsigned long long)psd.psd_mp_cpu_time[i][CP_NICE];
+ cpu->sys2_ticks = (unsigned long long)psd.psd_mp_cpu_time[i][CP_SYS]+
+ psd.psd_mp_cpu_time[i][CP_WAIT];
+ cpu->idle_ticks = (unsigned long long)psd.psd_mp_cpu_time[i][CP_IDLE];
+ cpu->wait_ticks = (unsigned long long)psd.psd_mp_cpu_time[i][CP_WAIT];
+ cpu->kern_ticks = (unsigned long long)psd.psd_mp_cpu_time[i][CP_SYS];
+ /* XXX - record (sum of) "all other ticks" */
+ }
+
+ return 0;
+}