components/net-snmp/sun/agent/modules/seaExtensions/sunHostPerf.c
changeset 252 ee0fb1eabcbf
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/net-snmp/sun/agent/modules/seaExtensions/sunHostPerf.c	Fri May 20 12:17:45 2011 +0530
@@ -0,0 +1,836 @@
+/*
+ * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * U.S. Government Rights - Commercial software. Government users are subject
+ * to the Sun Microsystems, Inc. standard license agreement and applicable
+ * provisions of the FAR and its supplements.
+ *
+ *
+ * This distribution may include materials developed by third parties. Sun,
+ * Sun Microsystems, the Sun logo and Solaris are trademarks or registered
+ * trademarks of Sun Microsystems, Inc. in the U.S. and other countries.
+ *
+ */
+/*
+ * Note: this file originally auto-generated by mib2c using
+ *         : mib2c.scalar.conf,v 1.5 2002/07/18 14:18:52 dts12 Exp $
+ */
+
+#include <net-snmp/net-snmp-config.h>
+#include <net-snmp/net-snmp-includes.h>
+#include <net-snmp/agent/net-snmp-agent-includes.h>
+
+#include <rpcsvc/rstat.h>
+
+#include "sunHostPerf.h"
+
+int hp_cache_lifetime = 45;
+time_t rs_cache_time = 0;
+time_t hp_cache_now = 0;
+static struct statstime sts;
+static char hostName[10];
+
+void
+get_rstats()
+{
+    (void) time(&hp_cache_now);
+
+    if ((hp_cache_now - rs_cache_time) <= hp_cache_lifetime)
+        return;
+
+    rs_cache_time = hp_cache_now;
+
+    (void) rstat(hostName, &sts);
+}
+
+/* Initializes the sunHostPerf module */
+void
+init_sunHostPerf(void)
+{
+    static oid rsNiceModeTime_oid[] =
+                            { 1, 3, 6, 1, 4, 1, 42, 3, 13, 2,  0 };
+    static oid rsIdleModeTime_oid[] =
+                            { 1, 3, 6, 1, 4, 1, 42, 3, 13, 4,  0 };
+    static oid rsVSwapIn_oid[] =
+                            { 1, 3, 6, 1, 4, 1, 42, 3, 13, 11,  0 };
+    static oid rsDiskXfer1_oid[] =
+                            { 1, 3, 6, 1, 4, 1, 42, 3, 13, 5,  0 };
+    static oid rsDiskXfer2_oid[] =
+                            { 1, 3, 6, 1, 4, 1, 42, 3, 13, 6,  0 };
+    static oid rsIfInErrors_oid[] =
+                            { 1, 3, 6, 1, 4, 1, 42, 3, 13, 16,  0 };
+    static oid rsDiskXfer3_oid[] =
+                            { 1, 3, 6, 1, 4, 1, 42, 3, 13, 7,  0 };
+    static oid rsVSwapOut_oid[] =
+                            { 1, 3, 6, 1, 4, 1, 42, 3, 13, 12,  0 };
+    static oid rsVPagesOut_oid[] =
+                            { 1, 3, 6, 1, 4, 1, 42, 3, 13, 10,  0 };
+    static oid rsDiskXfer4_oid[] =
+                            { 1, 3, 6, 1, 4, 1, 42, 3, 13, 8,  0 };
+    static oid rsSystemProcessTime_oid[] =
+                            { 1, 3, 6, 1, 4, 1, 42, 3, 13, 3,  0 };
+    static oid rsIfInPackets_oid[] =
+                            { 1, 3, 6, 1, 4, 1, 42, 3, 13, 14,  0 };
+    static oid rsVPagesIn_oid[] = { 1, 3, 6, 1, 4, 1, 42, 3, 13, 9,  0 };
+    static oid rsIfOutErrors_oid[] =
+                            { 1, 3, 6, 1, 4, 1, 42, 3, 13, 17,  0 };
+    static oid rsUserProcessTime_oid[] =
+                            { 1, 3, 6, 1, 4, 1, 42, 3, 13, 1,  0 };
+    static oid rsIfOutPackets_oid[] =
+                            { 1, 3, 6, 1, 4, 1, 42, 3, 13, 15,  0 };
+    static oid rsVIntr_oid[] = { 1, 3, 6, 1, 4, 1, 42, 3, 13, 13,  0 };
+    static oid rsIfCollisions_oid[] =
+                            { 1, 3, 6, 1, 4, 1, 42, 3, 13, 18,  0 };
+
+    DEBUGMSGTL(("sunHostPerf", "Initializing\n"));
+
+    /* Initialize host, current time */
+    strcpy(hostName, "localhost");
+    (void) time(&hp_cache_now);
+
+    netsnmp_register_read_only_instance(netsnmp_create_handler_registration
+                                    ("rsNiceModeTime",
+                                    get_rsNiceModeTime,
+                                    rsNiceModeTime_oid,
+                                    OID_LENGTH(rsNiceModeTime_oid),
+                                    HANDLER_CAN_RONLY));
+    netsnmp_register_read_only_instance(netsnmp_create_handler_registration
+                                    ("rsIdleModeTime",
+                                    get_rsIdleModeTime,
+                                    rsIdleModeTime_oid,
+                                    OID_LENGTH(rsIdleModeTime_oid),
+                                    HANDLER_CAN_RONLY));
+    netsnmp_register_read_only_instance(netsnmp_create_handler_registration
+                                    ("rsVSwapIn",
+                                    get_rsVSwapIn,
+                                    rsVSwapIn_oid,
+                                    OID_LENGTH(rsVSwapIn_oid),
+                                    HANDLER_CAN_RONLY));
+    netsnmp_register_read_only_instance(netsnmp_create_handler_registration
+                                    ("rsDiskXfer1",
+                                    get_rsDiskXfer1,
+                                    rsDiskXfer1_oid,
+                                    OID_LENGTH(rsDiskXfer1_oid),
+                                    HANDLER_CAN_RONLY));
+    netsnmp_register_read_only_instance(netsnmp_create_handler_registration
+                                    ("rsDiskXfer2",
+                                    get_rsDiskXfer2,
+                                    rsDiskXfer2_oid,
+                                    OID_LENGTH(rsDiskXfer2_oid),
+                                    HANDLER_CAN_RONLY));
+    netsnmp_register_read_only_instance(netsnmp_create_handler_registration
+                                    ("rsIfInErrors",
+                                    get_rsIfInErrors,
+                                    rsIfInErrors_oid,
+                                    OID_LENGTH(rsIfInErrors_oid),
+                                    HANDLER_CAN_RONLY));
+    netsnmp_register_read_only_instance(netsnmp_create_handler_registration
+                                    ("rsDiskXfer3",
+                                    get_rsDiskXfer3,
+                                    rsDiskXfer3_oid,
+                                    OID_LENGTH(rsDiskXfer3_oid),
+                                    HANDLER_CAN_RONLY));
+    netsnmp_register_read_only_instance(netsnmp_create_handler_registration
+                                    ("rsVSwapOut",
+                                    get_rsVSwapOut,
+                                    rsVSwapOut_oid,
+                                    OID_LENGTH(rsVSwapOut_oid),
+                                    HANDLER_CAN_RONLY));
+    netsnmp_register_read_only_instance(netsnmp_create_handler_registration
+                                    ("rsVPagesOut",
+                                    get_rsVPagesOut,
+                                    rsVPagesOut_oid,
+                                    OID_LENGTH(rsVPagesOut_oid),
+                                    HANDLER_CAN_RONLY));
+    netsnmp_register_read_only_instance(netsnmp_create_handler_registration
+                                    ("rsDiskXfer4",
+                                    get_rsDiskXfer4,
+                                    rsDiskXfer4_oid,
+                                    OID_LENGTH(rsDiskXfer4_oid),
+                                    HANDLER_CAN_RONLY));
+    netsnmp_register_read_only_instance(netsnmp_create_handler_registration
+                                    ("rsSystemProcessTime",
+                                    get_rsSystemProcessTime,
+                                    rsSystemProcessTime_oid,
+                                    OID_LENGTH(rsSystemProcessTime_oid),
+                                    HANDLER_CAN_RONLY));
+    netsnmp_register_read_only_instance(netsnmp_create_handler_registration
+                                    ("rsIfInPackets",
+                                    get_rsIfInPackets,
+                                    rsIfInPackets_oid,
+                                    OID_LENGTH(rsIfInPackets_oid),
+                                    HANDLER_CAN_RONLY));
+    netsnmp_register_read_only_instance(netsnmp_create_handler_registration
+                                    ("rsVPagesIn",
+                                    get_rsVPagesIn,
+                                    rsVPagesIn_oid,
+                                    OID_LENGTH(rsVPagesIn_oid),
+                                    HANDLER_CAN_RONLY));
+    netsnmp_register_read_only_instance(netsnmp_create_handler_registration
+                                    ("rsIfOutErrors",
+                                    get_rsIfOutErrors,
+                                    rsIfOutErrors_oid,
+                                    OID_LENGTH(rsIfOutErrors_oid),
+                                    HANDLER_CAN_RONLY));
+    netsnmp_register_read_only_instance(netsnmp_create_handler_registration
+                                    ("rsUserProcessTime",
+                                    get_rsUserProcessTime,
+                                    rsUserProcessTime_oid,
+                                    OID_LENGTH(rsUserProcessTime_oid),
+                                    HANDLER_CAN_RONLY));
+    netsnmp_register_read_only_instance(netsnmp_create_handler_registration
+                                    ("rsIfOutPackets",
+                                    get_rsIfOutPackets,
+                                    rsIfOutPackets_oid,
+                                    OID_LENGTH(rsIfOutPackets_oid),
+                                    HANDLER_CAN_RONLY));
+    netsnmp_register_read_only_instance(netsnmp_create_handler_registration
+                                    ("rsVIntr",
+                                    get_rsVIntr,
+                                    rsVIntr_oid,
+                                    OID_LENGTH(rsVIntr_oid),
+                                    HANDLER_CAN_RONLY));
+    netsnmp_register_read_only_instance(netsnmp_create_handler_registration
+                                    ("rsIfCollisions",
+                                    get_rsIfCollisions,
+                                    rsIfCollisions_oid,
+                                    OID_LENGTH(rsIfCollisions_oid),
+                                    HANDLER_CAN_RONLY));
+}
+
+int
+get_rsNiceModeTime(netsnmp_mib_handler *handler,
+                   netsnmp_handler_registration *reginfo,
+                   netsnmp_agent_request_info *reqinfo,
+                   netsnmp_request_info *requests)
+{
+    long cp_time;
+
+    /*
+     * We are never called for a GETNEXT if it's registered as a
+     * "instance", as it's "magically" handled for us.
+     */
+
+    /*
+     * a instance handler also only hands us one request at a time, so
+     * we don't need to loop over a list of requests; we'll only get one.
+     */
+
+    switch (reqinfo->mode) {
+
+    case MODE_GET:
+        get_rstats();
+        cp_time = (long)sts.cp_time[RSTAT_CPU_NICE];
+        snmp_set_var_typed_value(requests->requestvb, ASN_COUNTER,
+                                 (u_char *) &cp_time, sizeof (cp_time));
+        break;
+
+    default:
+        /* we should never get here, so this is a really bad error */
+        return (SNMP_ERR_GENERR);
+    }
+
+    return (SNMP_ERR_NOERROR);
+}
+
+int
+get_rsIdleModeTime(netsnmp_mib_handler *handler,
+                   netsnmp_handler_registration *reginfo,
+                   netsnmp_agent_request_info *reqinfo,
+                   netsnmp_request_info *requests)
+{
+    long cp_time;
+
+    /*
+     * We are never called for a GETNEXT if it's registered as a
+     * "instance", as it's "magically" handled for us.
+     */
+
+    /*
+     * a instance handler also only hands us one request at a time, so
+     * we don't need to loop over a list of requests; we'll only get one.
+     */
+
+    switch (reqinfo->mode) {
+
+    case MODE_GET:
+        get_rstats();
+        cp_time = (long)sts.cp_time[RSTAT_CPU_IDLE];
+        snmp_set_var_typed_value(requests->requestvb, ASN_COUNTER,
+                                 (u_char *) &cp_time, sizeof (cp_time));
+        break;
+
+    default:
+        /* we should never get here, so this is a really bad error */
+        return (SNMP_ERR_GENERR);
+    }
+
+    return (SNMP_ERR_NOERROR);
+}
+
+int
+get_rsVSwapIn(netsnmp_mib_handler *handler,
+              netsnmp_handler_registration *reginfo,
+              netsnmp_agent_request_info *reqinfo,
+              netsnmp_request_info *requests)
+{
+    u_long v_pswpin;
+
+    /*
+     * We are never called for a GETNEXT if it's registered as a
+     * "instance", as it's "magically" handled for us.
+     */
+
+    /*
+     * a instance handler also only hands us one request at a time, so
+     * we don't need to loop over a list of requests; we'll only get one.
+     */
+
+    switch (reqinfo->mode) {
+
+    case MODE_GET:
+        get_rstats();
+        v_pswpin = (u_long)sts.v_pswpin;
+        snmp_set_var_typed_value(requests->requestvb, ASN_COUNTER,
+                                 (u_char *) &v_pswpin, sizeof (v_pswpin));
+        break;
+
+    default:
+        /* we should never get here, so this is a really bad error */
+        return (SNMP_ERR_GENERR);
+    }
+
+    return (SNMP_ERR_NOERROR);
+}
+
+int
+get_rsDiskXfer1(netsnmp_mib_handler *handler,
+                netsnmp_handler_registration *reginfo,
+                netsnmp_agent_request_info *reqinfo,
+                netsnmp_request_info *requests)
+{
+    long dk_xfer;
+
+    /*
+     * We are never called for a GETNEXT if it's registered as a
+     * "instance", as it's "magically" handled for us.
+     */
+
+    /*
+     * a instance handler also only hands us one request at a time, so
+     * we don't need to loop over a list of requests; we'll only get one.
+     */
+
+    switch (reqinfo->mode) {
+
+    case MODE_GET:
+        get_rstats();
+        dk_xfer = (long)sts.dk_xfer[0];
+        snmp_set_var_typed_value(requests->requestvb, ASN_COUNTER,
+                                 (u_char *) &dk_xfer, sizeof (dk_xfer));
+        break;
+
+    default:
+        /* we should never get here, so this is a really bad error */
+        return (SNMP_ERR_GENERR);
+    }
+
+    return (SNMP_ERR_NOERROR);
+}
+
+int
+get_rsDiskXfer2(netsnmp_mib_handler *handler,
+                netsnmp_handler_registration *reginfo,
+                netsnmp_agent_request_info *reqinfo,
+                netsnmp_request_info *requests)
+{
+    long dk_xfer;
+
+    /*
+     * We are never called for a GETNEXT if it's registered as a
+     * "instance", as it's "magically" handled for us.
+     */
+
+    /*
+     * a instance handler also only hands us one request at a time, so
+     * we don't need to loop over a list of requests; we'll only get one.
+    */
+
+    switch (reqinfo->mode) {
+
+    case MODE_GET:
+        get_rstats();
+        dk_xfer = sts.dk_xfer[1];
+        snmp_set_var_typed_value(requests->requestvb, ASN_COUNTER,
+                                 (u_char *) &dk_xfer, sizeof (dk_xfer));
+        break;
+
+    default:
+        /* we should never get here, so this is a really bad error */
+        return (SNMP_ERR_GENERR);
+    }
+
+    return (SNMP_ERR_NOERROR);
+}
+
+int
+get_rsIfInErrors(netsnmp_mib_handler *handler,
+                 netsnmp_handler_registration *reginfo,
+                 netsnmp_agent_request_info *reqinfo,
+                 netsnmp_request_info *requests)
+{
+    long if_ierrors;
+
+    /*
+     * We are never called for a GETNEXT if it's registered as a
+     * "instance", as it's "magically" handled for us.
+     */
+
+    /*
+     * a instance handler also only hands us one request at a time, so
+     * we don't need to loop over a list of requests; we'll only get one.
+     */
+
+    switch (reqinfo->mode) {
+
+    case MODE_GET:
+        get_rstats();
+        if_ierrors = (long)sts.if_ierrors;
+        snmp_set_var_typed_value(requests->requestvb, ASN_COUNTER,
+                                 (u_char *) &if_ierrors, sizeof (if_ierrors));
+        break;
+
+    default:
+        /* we should never get here, so this is a really bad error */
+        return (SNMP_ERR_GENERR);
+    }
+
+    return (SNMP_ERR_NOERROR);
+}
+
+int
+get_rsDiskXfer3(netsnmp_mib_handler *handler,
+                netsnmp_handler_registration *reginfo,
+                netsnmp_agent_request_info *reqinfo,
+                netsnmp_request_info *requests)
+{
+    long dk_xfer;
+
+    /*
+     * We are never called for a GETNEXT if it's registered as a
+     * "instance", as it's "magically" handled for us.
+     */
+
+    /*
+     * a instance handler also only hands us one request at a time, so
+     * we don't need to loop over a list of requests; we'll only get one.
+     */
+
+    switch (reqinfo->mode) {
+
+    case MODE_GET:
+        get_rstats();
+        dk_xfer = (long)sts.dk_xfer[2];
+        snmp_set_var_typed_value(requests->requestvb, ASN_COUNTER,
+                                 (u_char *) &dk_xfer, sizeof (dk_xfer));
+        break;
+
+
+    default:
+        /* we should never get here, so this is a really bad error */
+        return (SNMP_ERR_GENERR);
+    }
+
+    return (SNMP_ERR_NOERROR);
+}
+
+int
+get_rsVSwapOut(netsnmp_mib_handler *handler,
+               netsnmp_handler_registration *reginfo,
+               netsnmp_agent_request_info *reqinfo,
+               netsnmp_request_info *requests)
+{
+    u_long v_pswpout;
+
+    /*
+     * We are never called for a GETNEXT if it's registered as a
+     * "instance", as it's "magically" handled for us.
+     */
+
+    /*
+     * a instance handler also only hands us one request at a time, so
+     * we don't need to loop over a list of requests; we'll only get one.
+     */
+
+    switch (reqinfo->mode) {
+
+    case MODE_GET:
+        get_rstats();
+        v_pswpout = (u_long)sts.v_pswpout;
+        snmp_set_var_typed_value(requests->requestvb, ASN_COUNTER,
+                                 (u_char *) &v_pswpout, sizeof (v_pswpout));
+        break;
+
+
+    default:
+        /* we should never get here, so this is a really bad error */
+        return (SNMP_ERR_GENERR);
+    }
+
+    return (SNMP_ERR_NOERROR);
+}
+
+int
+get_rsVPagesOut(netsnmp_mib_handler *handler,
+                netsnmp_handler_registration *reginfo,
+                netsnmp_agent_request_info *reqinfo,
+                netsnmp_request_info *requests)
+{
+    u_long v_pgpgout;
+
+    /*
+     * We are never called for a GETNEXT if it's registered as a
+     * "instance", as it's "magically" handled for us.
+     */
+
+    /*
+     * a instance handler also only hands us one request at a time, so
+     * we don't need to loop over a list of requests; we'll only get one.
+     */
+
+    switch (reqinfo->mode) {
+
+    case MODE_GET:
+        get_rstats();
+        v_pgpgout = (u_long)sts.v_pgpgout;
+        snmp_set_var_typed_value(requests->requestvb, ASN_COUNTER,
+                                 (u_char *) &v_pgpgout, sizeof (v_pgpgout));
+        break;
+
+
+    default:
+        /* we should never get here, so this is a really bad error */
+        return (SNMP_ERR_GENERR);
+    }
+
+    return (SNMP_ERR_NOERROR);
+}
+
+int
+get_rsDiskXfer4(netsnmp_mib_handler *handler,
+                netsnmp_handler_registration *reginfo,
+                netsnmp_agent_request_info *reqinfo,
+                netsnmp_request_info *requests)
+{
+    long dk_xfer;
+
+    /*
+     * We are never called for a GETNEXT if it's registered as a
+     * "instance", as it's "magically" handled for us.
+     */
+
+    /*
+     * a instance handler also only hands us one request at a time, so
+     * we don't need to loop over a list of requests; we'll only get one.
+     */
+
+    switch (reqinfo->mode) {
+
+    case MODE_GET:
+        get_rstats();
+        dk_xfer = (long)sts.dk_xfer[3];
+        snmp_set_var_typed_value(requests->requestvb, ASN_COUNTER,
+                                 (u_char *) &dk_xfer, sizeof (dk_xfer));
+        break;
+
+
+    default:
+        /* we should never get here, so this is a really bad error */
+        return (SNMP_ERR_GENERR);
+    }
+
+    return (SNMP_ERR_NOERROR);
+}
+
+int
+get_rsSystemProcessTime(netsnmp_mib_handler *handler,
+                        netsnmp_handler_registration *reginfo,
+                        netsnmp_agent_request_info *reqinfo,
+                        netsnmp_request_info *requests)
+{
+    long cp_time;
+
+    /*
+     * We are never called for a GETNEXT if it's registered as a
+     * "instance", as it's "magically" handled for us.
+     */
+
+    /*
+     * a instance handler also only hands us one request at a time, so
+     * we don't need to loop over a list of requests; we'll only get one.
+     */
+
+    switch (reqinfo->mode) {
+
+    case MODE_GET:
+        get_rstats();
+        cp_time = (long)sts.cp_time[RSTAT_CPU_SYS];
+        snmp_set_var_typed_value(requests->requestvb, ASN_COUNTER,
+                                 (u_char *) &cp_time, sizeof (cp_time));
+        break;
+
+    default:
+        /* we should never get here, so this is a really bad error */
+        return (SNMP_ERR_GENERR);
+    }
+
+    return (SNMP_ERR_NOERROR);
+}
+
+int
+get_rsIfInPackets(netsnmp_mib_handler *handler,
+                  netsnmp_handler_registration *reginfo,
+                  netsnmp_agent_request_info *reqinfo,
+                  netsnmp_request_info *requests)
+{
+    long if_ipackets;
+
+    /*
+     * We are never called for a GETNEXT if it's registered as a
+     * "instance", as it's "magically" handled for us.
+     */
+
+    /*
+     * a instance handler also only hands us one request at a time, so
+     * we don't need to loop over a list of requests; we'll only get one.
+     */
+
+    switch (reqinfo->mode) {
+
+    case MODE_GET:
+        get_rstats();
+        if_ipackets = (long)sts.if_ipackets;
+        snmp_set_var_typed_value(requests->requestvb, ASN_COUNTER,
+                                 (u_char *) &if_ipackets, sizeof (if_ipackets));
+        break;
+
+
+    default:
+        /* we should never get here, so this is a really bad error */
+        return (SNMP_ERR_GENERR);
+    }
+
+    return (SNMP_ERR_NOERROR);
+}
+
+int
+get_rsVPagesIn(netsnmp_mib_handler *handler,
+               netsnmp_handler_registration *reginfo,
+               netsnmp_agent_request_info *reqinfo,
+               netsnmp_request_info *requests)
+{
+    u_long v_pgpgin;
+
+    /*
+     * We are never called for a GETNEXT if it's registered as a
+     * "instance", as it's "magically" handled for us.
+     */
+
+    /*
+     * a instance handler also only hands us one request at a time, so
+     * we don't need to loop over a list of requests; we'll only get one.
+     */
+
+    switch (reqinfo->mode) {
+
+    case MODE_GET:
+        get_rstats();
+        v_pgpgin = (u_long)sts.v_pgpgin;
+        snmp_set_var_typed_value(requests->requestvb, ASN_COUNTER,
+                                 (u_char *) &v_pgpgin, sizeof (v_pgpgin));
+        break;
+
+    default:
+        /* we should never get here, so this is a really bad error */
+        return (SNMP_ERR_GENERR);
+    }
+
+    return (SNMP_ERR_NOERROR);
+}
+
+int
+get_rsIfOutErrors(netsnmp_mib_handler *handler,
+                  netsnmp_handler_registration *reginfo,
+                  netsnmp_agent_request_info *reqinfo,
+                  netsnmp_request_info *requests)
+{
+    long if_oerrors;
+
+    /*
+     * We are never called for a GETNEXT if it's registered as a
+     * "instance", as it's "magically" handled for us.
+     */
+
+    /*
+     * a instance handler also only hands us one request at a time, so
+     * we don't need to loop over a list of requests; we'll only get one.
+     */
+
+    switch (reqinfo->mode) {
+
+    case MODE_GET:
+        get_rstats();
+        if_oerrors = (long)sts.if_oerrors;
+        snmp_set_var_typed_value(requests->requestvb, ASN_COUNTER,
+                                 (u_char *) &if_oerrors, sizeof (if_oerrors));
+        break;
+
+    default:
+        /* we should never get here, so this is a really bad error */
+        return (SNMP_ERR_GENERR);
+    }
+
+    return (SNMP_ERR_NOERROR);
+}
+
+int
+get_rsUserProcessTime(netsnmp_mib_handler *handler,
+                      netsnmp_handler_registration *reginfo,
+                      netsnmp_agent_request_info *reqinfo,
+                      netsnmp_request_info *requests)
+{
+    long cp_time;
+
+    /*
+     * We are never called for a GETNEXT if it's registered as a
+     * "instance", as it's "magically" handled for us.
+     */
+
+    /*
+     * a instance handler also only hands us one request at a time, so
+     * we don't need to loop over a list of requests; we'll only get one.
+     */
+
+    switch (reqinfo->mode) {
+
+    case MODE_GET:
+        get_rstats();
+        cp_time = sts.cp_time[RSTAT_CPU_USER];
+        snmp_set_var_typed_value(requests->requestvb, ASN_COUNTER,
+                                 (u_char *) &cp_time, sizeof (cp_time));
+        break;
+
+    default:
+        /* we should never get here, so this is a really bad error */
+        return (SNMP_ERR_GENERR);
+    }
+
+    return (SNMP_ERR_NOERROR);
+}
+
+int
+get_rsIfOutPackets(netsnmp_mib_handler *handler,
+                   netsnmp_handler_registration *reginfo,
+                   netsnmp_agent_request_info *reqinfo,
+                   netsnmp_request_info *requests)
+{
+    long if_opackets;
+
+    /*
+     * We are never called for a GETNEXT if it's registered as a
+     * "instance", as it's "magically" handled for us.
+     */
+
+    /*
+     * a instance handler also only hands us one request at a time, so
+     * we don't need to loop over a list of requests; we'll only get one.
+     */
+
+    switch (reqinfo->mode) {
+
+    case MODE_GET:
+        get_rstats();
+        if_opackets = (long)sts.if_opackets;
+        snmp_set_var_typed_value(requests->requestvb, ASN_COUNTER,
+                                 (u_char *) &if_opackets, sizeof (if_opackets));
+        break;
+
+
+    default:
+        /* we should never get here, so this is a really bad error */
+        return (SNMP_ERR_GENERR);
+    }
+
+    return (SNMP_ERR_NOERROR);
+}
+
+int
+get_rsVIntr(netsnmp_mib_handler *handler,
+            netsnmp_handler_registration *reginfo,
+            netsnmp_agent_request_info *reqinfo,
+            netsnmp_request_info *requests)
+{
+    u_long v_intr;
+
+    /*
+     * We are never called for a GETNEXT if it's registered as a
+     * "instance", as it's "magically" handled for us.
+     */
+
+    /*
+     * a instance handler also only hands us one request at a time, so
+     * we don't need to loop over a list of requests; we'll only get one.
+     */
+
+    switch (reqinfo->mode) {
+
+    case MODE_GET:
+        get_rstats();
+        v_intr = (u_long)sts.v_intr;
+        snmp_set_var_typed_value(requests->requestvb, ASN_COUNTER,
+                                 (u_char *) &v_intr, sizeof (v_intr));
+        break;
+
+    default:
+        /* we should never get here, so this is a really bad error */
+        return (SNMP_ERR_GENERR);
+    }
+
+    return (SNMP_ERR_NOERROR);
+}
+
+int
+get_rsIfCollisions(netsnmp_mib_handler *handler,
+                   netsnmp_handler_registration *reginfo,
+                   netsnmp_agent_request_info *reqinfo,
+                   netsnmp_request_info *requests)
+{
+    long if_collisions;
+
+    /*
+     * We are never called for a GETNEXT if it's registered as a
+     * "instance", as it's "magically" handled for us.
+     */
+
+    /*
+     * a instance handler also only hands us one request at a time, so
+     * we don't need to loop over a list of requests; we'll only get one.
+     */
+
+    switch (reqinfo->mode) {
+
+    case MODE_GET:
+        get_rstats();
+        if_collisions = (long)sts.if_collisions;
+        snmp_set_var_typed_value(requests->requestvb, ASN_COUNTER,
+                                 (u_char *) &if_collisions, 
+                                 sizeof (if_collisions));
+        break;
+
+    default:
+        /* we should never get here, so this is a really bad error */
+        return (SNMP_ERR_GENERR);
+    }
+
+    return (SNMP_ERR_NOERROR);
+}