/* * DragonFly kinfo interface */ #include #include #include #include #include #include #include #include #include void _cpu_copy_stats( netsnmp_cpu_info *cpu ); /* * Initialise the list of CPUs on the system * (including descriptions) */ void init_cpu_nlist( 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; }