blob: 974028af00ddedb189725b98bcbf59ea985f5877 [file] [log] [blame]
/*
* 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;
}