blob: 37cf847b988907a2152ea5f57097d50764fec1b5 [file] [log] [blame]
/*
* DragonFly kinfo interface
*/
#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 <sys/param.h>
#include <sys/vmmeter.h>
#include <kinfo.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/sysctl.h>
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_kinfo( void ) {
netsnmp_cpu_info *cpu;
int i;
size_t len;
char descr[ SNMP_MAXBUF ];
cpu = netsnmp_cpu_get_byIdx( -1, 1 );
strcpy(cpu->name, "Overall CPU statistics");
kinfo_get_cpus(&cpu_num);
len = sizeof(descr);
sysctlbyname("hw.model", descr, &len, NULL, 0);
for ( i = 0; i < cpu_num; i++ ) {
cpu = netsnmp_cpu_get_byIdx( i, 1 );
cpu->status = 2; /* running */
sprintf(cpu->name, "cpu%d", i);
sprintf(cpu->descr, "%s", descr);
}
}
/*
* Load the latest CPU usage statistics
*/
int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
struct vmmeter vmm;
size_t len;
struct kinfo_cputime cp_time;
netsnmp_cpu_info *cpu = netsnmp_cpu_get_byIdx( -1, 0 );
kinfo_get_sched_cputime(&cp_time);
len = sizeof(vmm);
sysctlbyname("vm.vmmeter", &vmm, &len, NULL, 0);
cpu->user_ticks = cp_time.cp_user;
cpu->nice_ticks = cp_time.cp_nice;
cpu->sys2_ticks = cp_time.cp_sys + cp_time.cp_intr;
cpu->idle_ticks = cp_time.cp_idle;
cpu->kern_ticks = cp_time.cp_sys;
cpu->intrpt_ticks = cp_time.cp_intr;
cpu->swapIn = vmm.v_swappgsin + vmm.v_vnodepgsin;
cpu->swapOut = vmm.v_swappgsout + vmm.v_vnodepgsout;
cpu->nInterrupts = vmm.v_intr;
cpu->nCtxSwitches = vmm.v_swtch;
/* Copy "overall" figures to cpu0 entry */
_cpu_copy_stats( cpu );
return 0;
}