I think the subject says it all. I'm not a 100% convinced that 
appl_internal_snmp()
should live in application_internal.c, maybe snmpe.c, where these metrics are 
set
is a better place. But since things come from mib.c, let's keep it simply here 
and
we can always shuffle the deckchairs later.

OK?

martijn@

diff --git a/application_internal.c b/application_internal.c
index ff9611e..c76e8ef 100644
--- a/application_internal.c
+++ b/application_internal.c
@@ -44,6 +44,7 @@ void appl_internal_get(struct appl_backend *, int32_t, 
int32_t, const char *,
     struct appl_varbind *);
 void appl_internal_getnext(struct appl_backend *, int32_t, int32_t,
     const char *, struct appl_varbind *);
+struct ber_element *appl_internal_snmp(struct ber_oid *);
 struct appl_internal_object *appl_internal_object_parent(struct ber_oid *);
 int appl_internal_object_cmp(struct appl_internal_object *,
     struct appl_internal_object *);
@@ -70,6 +71,63 @@ RB_PROTOTYPE_STATIC(appl_internal_objects, 
appl_internal_object, entry,
 void
 appl_internal_init(void)
 {
+       appl_internal_region(&OID(MIB_snmp));
+       appl_internal_object(&OID(MIB_snmpInPkts), appl_internal_snmp, NULL);
+       appl_internal_object(&OID(MIB_snmpOutPkts), appl_internal_snmp, NULL);
+       appl_internal_object(&OID(MIB_snmpInBadVersions), appl_internal_snmp,
+          NULL);
+       appl_internal_object(&OID(MIB_snmpInBadCommunityNames),
+          appl_internal_snmp, NULL);
+       appl_internal_object(&OID(MIB_snmpInBadCommunityUses),
+          appl_internal_snmp, NULL);
+       appl_internal_object(&OID(MIB_snmpInASNParseErrs), appl_internal_snmp,
+           NULL);
+       appl_internal_object(&OID(MIB_snmpInTooBigs), appl_internal_snmp, NULL);
+       appl_internal_object(&OID(MIB_snmpInNoSuchNames), appl_internal_snmp,
+           NULL);
+       appl_internal_object(&OID(MIB_snmpInBadValues), appl_internal_snmp,
+           NULL);
+       appl_internal_object(&OID(MIB_snmpInReadOnlys), appl_internal_snmp,
+           NULL);
+       appl_internal_object(&OID(MIB_snmpInReadOnlys), appl_internal_snmp,
+           NULL);
+       appl_internal_object(&OID(MIB_snmpInGenErrs), appl_internal_snmp, NULL);
+       appl_internal_object(&OID(MIB_snmpInTotalReqVars), appl_internal_snmp,
+           NULL);
+       appl_internal_object(&OID(MIB_snmpInTotalSetVars), appl_internal_snmp,
+           NULL);
+       appl_internal_object(&OID(MIB_snmpInGetRequests), appl_internal_snmp,
+           NULL);
+       appl_internal_object(&OID(MIB_snmpInGetNexts), appl_internal_snmp,
+           NULL);
+       appl_internal_object(&OID(MIB_snmpInSetRequests), appl_internal_snmp,
+           NULL);
+       appl_internal_object(&OID(MIB_snmpInGetResponses), appl_internal_snmp,
+           NULL);
+       appl_internal_object(&OID(MIB_snmpInTraps), appl_internal_snmp, NULL);
+       appl_internal_object(&OID(MIB_snmpOutTooBigs), appl_internal_snmp,
+           NULL);
+       appl_internal_object(&OID(MIB_snmpOutNoSuchNames), appl_internal_snmp,
+           NULL);
+       appl_internal_object(&OID(MIB_snmpOutBadValues), appl_internal_snmp,
+           NULL);
+       appl_internal_object(&OID(MIB_snmpOutGenErrs), appl_internal_snmp,
+           NULL);
+       appl_internal_object(&OID(MIB_snmpOutGetRequests), appl_internal_snmp,
+           NULL);
+       appl_internal_object(&OID(MIB_snmpOutGetNexts), appl_internal_snmp,
+           NULL);
+       appl_internal_object(&OID(MIB_snmpOutSetRequests), appl_internal_snmp,
+           NULL);
+       appl_internal_object(&OID(MIB_snmpOutGetResponses), appl_internal_snmp,
+           NULL);
+       appl_internal_object(&OID(MIB_snmpOutTraps), appl_internal_snmp, NULL);
+       appl_internal_object(&OID(MIB_snmpEnableAuthenTraps),
+           appl_internal_snmp, NULL);
+       appl_internal_object(&OID(MIB_snmpSilentDrops), appl_internal_snmp,
+           NULL);
+       appl_internal_object(&OID(MIB_snmpProxyDrops), appl_internal_snmp,
+           NULL);
 }
 
 void
@@ -245,6 +303,79 @@ appl_internal_getnext(struct appl_backend *backend,
        appl_response(backend, requestid, APPL_ERROR_GENERR, i + 1, vblist);
 }
 
+struct ber_element *
+appl_internal_snmp(struct ber_oid *oid)
+{
+       struct snmp_stats *stats = &snmpd_env->sc_stats;
+       struct ber_element *value = NULL;
+
+       if (ober_oid_cmp(oid, &OID(MIB_snmpEnableAuthenTraps, 0)) == 0)
+               return ober_add_integer(NULL,
+                   stats->snmp_enableauthentraps ? 1 : 2);
+       if (ober_oid_cmp(&OID(MIB_snmpInPkts, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_inpkts);
+       else if (ober_oid_cmp(&OID(MIB_snmpOutPkts, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_outpkts);
+       else if (ober_oid_cmp(&OID(MIB_snmpInBadVersions, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_inbadversions);
+       else if (ober_oid_cmp(&OID(MIB_snmpInBadCommunityNames, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_inbadcommunitynames);
+       else if (ober_oid_cmp(&OID(MIB_snmpInBadCommunityUses, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_inbadcommunityuses);
+       else if (ober_oid_cmp(&OID(MIB_snmpInASNParseErrs, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_inasnparseerrs);
+       else if (ober_oid_cmp(&OID(MIB_snmpInTooBigs, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_intoobigs);
+       else if (ober_oid_cmp(&OID(MIB_snmpInNoSuchNames, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_innosuchnames);
+       else if (ober_oid_cmp(&OID(MIB_snmpInBadValues, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_inbadvalues);
+       else if (ober_oid_cmp(&OID(MIB_snmpInReadOnlys, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_inreadonlys);
+       else if (ober_oid_cmp(&OID(MIB_snmpInGenErrs, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_ingenerrs);
+       else if (ober_oid_cmp(&OID(MIB_snmpInTotalReqVars, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_intotalreqvars);
+       else if (ober_oid_cmp(&OID(MIB_snmpInTotalSetVars, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_intotalsetvars);
+       else if (ober_oid_cmp(&OID(MIB_snmpInGetRequests, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_ingetrequests);
+       else if (ober_oid_cmp(&OID(MIB_snmpInGetNexts, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_ingetnexts);
+       else if (ober_oid_cmp(&OID(MIB_snmpInSetRequests, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_insetrequests);
+       else if (ober_oid_cmp(&OID(MIB_snmpInGetResponses, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_ingetresponses);
+       else if (ober_oid_cmp(&OID(MIB_snmpInTraps, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_intraps);
+       else if (ober_oid_cmp(&OID(MIB_snmpOutTooBigs, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_outtoobigs);
+       else if (ober_oid_cmp(&OID(MIB_snmpOutNoSuchNames, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_outnosuchnames);
+       else if (ober_oid_cmp(&OID(MIB_snmpOutBadValues, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_outbadvalues);
+       else if (ober_oid_cmp(&OID(MIB_snmpOutGenErrs, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_outgenerrs);
+       else if (ober_oid_cmp(&OID(MIB_snmpOutGetRequests, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_outgetrequests);
+       else if (ober_oid_cmp(&OID(MIB_snmpOutGetNexts, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_outgetnexts);
+       else if (ober_oid_cmp(&OID(MIB_snmpOutSetRequests, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_outsetrequests);
+       else if (ober_oid_cmp(&OID(MIB_snmpOutGetResponses, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_outgetresponses);
+       else if (ober_oid_cmp(&OID(MIB_snmpOutTraps, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_outtraps);
+       else if (ober_oid_cmp(&OID(MIB_snmpSilentDrops, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_silentdrops);
+       else if (ober_oid_cmp(&OID(MIB_snmpProxyDrops, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_proxydrops);
+
+       if (value != NULL)
+               ober_set_header(value, BER_CLASS_APPLICATION, SNMP_T_COUNTER32);
+       return value;
+}
+
 struct appl_internal_object *
 appl_internal_object_parent(struct ber_oid *oid)
 {
diff --git a/mib.c b/mib.c
index 086978d..ef34983 100644
--- a/mib.c
+++ b/mib.c
@@ -65,9 +65,7 @@
  */
 
 int     mib_getsys(struct oid *, struct ber_oid *, struct ber_element **);
-int     mib_getsnmp(struct oid *, struct ber_oid *, struct ber_element **);
 int     mib_sysor(struct oid *, struct ber_oid *, struct ber_element **);
-int     mib_setsnmp(struct oid *, struct ber_oid *, struct ber_element **);
 
 static struct oid mib_tree[] = MIB_TREE;
 
@@ -86,37 +84,6 @@ static struct oid base_mib[] = {
        { MIB(sysORID),                 OID_TRD, mib_sysor },
        { MIB(sysORDescr),              OID_TRD, mib_sysor },
        { MIB(sysORUpTime),             OID_TRD, mib_sysor },
-       { MIB(snmp),                    OID_MIB },
-       { MIB(snmpInPkts),              OID_RD, mib_getsnmp },
-       { MIB(snmpOutPkts),             OID_RD, mib_getsnmp },
-       { MIB(snmpInBadVersions),       OID_RD, mib_getsnmp },
-       { MIB(snmpInBadCommunityNames), OID_RD, mib_getsnmp },
-       { MIB(snmpInBadCommunityUses),  OID_RD, mib_getsnmp },
-       { MIB(snmpInASNParseErrs),      OID_RD, mib_getsnmp },
-       { MIB(snmpInTooBigs),           OID_RD, mib_getsnmp },
-       { MIB(snmpInNoSuchNames),       OID_RD, mib_getsnmp },
-       { MIB(snmpInBadValues),         OID_RD, mib_getsnmp },
-       { MIB(snmpInReadOnlys),         OID_RD, mib_getsnmp },
-       { MIB(snmpInGenErrs),           OID_RD, mib_getsnmp },
-       { MIB(snmpInTotalReqVars),      OID_RD, mib_getsnmp },
-       { MIB(snmpInTotalSetVars),      OID_RD, mib_getsnmp },
-       { MIB(snmpInGetRequests),       OID_RD, mib_getsnmp },
-       { MIB(snmpInGetNexts),          OID_RD, mib_getsnmp },
-       { MIB(snmpInSetRequests),       OID_RD, mib_getsnmp },
-       { MIB(snmpInGetResponses),      OID_RD, mib_getsnmp },
-       { MIB(snmpInTraps),             OID_RD, mib_getsnmp },
-       { MIB(snmpOutTooBigs),          OID_RD, mib_getsnmp },
-       { MIB(snmpOutNoSuchNames),      OID_RD, mib_getsnmp },
-       { MIB(snmpOutBadValues),        OID_RD, mib_getsnmp },
-       { MIB(snmpOutGenErrs),          OID_RD, mib_getsnmp },
-       { MIB(snmpOutGetRequests),      OID_RD, mib_getsnmp },
-       { MIB(snmpOutGetNexts),         OID_RD, mib_getsnmp },
-       { MIB(snmpOutSetRequests),      OID_RD, mib_getsnmp },
-       { MIB(snmpOutGetResponses),     OID_RD, mib_getsnmp },
-       { MIB(snmpOutTraps),            OID_RD, mib_getsnmp },
-       { MIB(snmpEnableAuthenTraps),   OID_RD, mib_getsnmp },
-       { MIB(snmpSilentDrops),         OID_RD, mib_getsnmp },
-       { MIB(snmpProxyDrops),          OID_RD, mib_getsnmp },
        { MIBEND }
 };
 
@@ -249,81 +216,6 @@ mib_sysor(struct oid *oid, struct ber_oid *o, struct 
ber_element **elm)
        return (0);
 }
 
-int
-mib_getsnmp(struct oid *oid, struct ber_oid *o, struct ber_element **elm)
-{
-       struct snmp_stats       *stats = &snmpd_env->sc_stats;
-       long long                i;
-       struct statsmap {
-               u_int8_t         m_id;
-               u_int32_t       *m_ptr;
-       }                        mapping[] = {
-               { 1, &stats->snmp_inpkts },
-               { 2, &stats->snmp_outpkts },
-               { 3, &stats->snmp_inbadversions },
-               { 4, &stats->snmp_inbadcommunitynames },
-               { 5, &stats->snmp_inbadcommunityuses },
-               { 6, &stats->snmp_inasnparseerrs },
-               { 8, &stats->snmp_intoobigs },
-               { 9, &stats->snmp_innosuchnames },
-               { 10, &stats->snmp_inbadvalues },
-               { 11, &stats->snmp_inreadonlys },
-               { 12, &stats->snmp_ingenerrs },
-               { 13, &stats->snmp_intotalreqvars },
-               { 14, &stats->snmp_intotalsetvars },
-               { 15, &stats->snmp_ingetrequests },
-               { 16, &stats->snmp_ingetnexts },
-               { 17, &stats->snmp_insetrequests },
-               { 18, &stats->snmp_ingetresponses },
-               { 19, &stats->snmp_intraps },
-               { 20, &stats->snmp_outtoobigs },
-               { 21, &stats->snmp_outnosuchnames },
-               { 22, &stats->snmp_outbadvalues },
-               { 24, &stats->snmp_outgenerrs },
-               { 25, &stats->snmp_outgetrequests },
-               { 26, &stats->snmp_outgetnexts },
-               { 27, &stats->snmp_outsetrequests },
-               { 28, &stats->snmp_outgetresponses },
-               { 29, &stats->snmp_outtraps },
-               { 31, &stats->snmp_silentdrops },
-               { 32, &stats->snmp_proxydrops }
-       };
-
-       switch (oid->o_oid[OIDIDX_snmp]) {
-       case 30:
-               i = stats->snmp_enableauthentraps == 1 ? 1 : 2;
-               *elm = ober_add_integer(*elm, i);
-               break;
-       default:
-               for (i = 0;
-                   (u_int)i < (sizeof(mapping) / sizeof(mapping[0])); i++) {
-                       if (oid->o_oid[OIDIDX_snmp] == mapping[i].m_id) {
-                               *elm = ober_add_integer(*elm, 
*mapping[i].m_ptr);
-                               ober_set_header(*elm,
-                                   BER_CLASS_APPLICATION, SNMP_T_COUNTER32);
-                               return (0);
-                       }
-               }
-               return (-1);
-       }
-
-       return (0);
-}
-
-int
-mib_setsnmp(struct oid *oid, struct ber_oid *o, struct ber_element **elm)
-{
-       struct snmp_stats       *stats = &snmpd_env->sc_stats;
-       long long                i;
-
-       if (ober_get_integer(*elm, &i) == -1)
-               return (-1);
-
-       stats->snmp_enableauthentraps = i == 1 ? 1 : 0;
-
-       return (0);
-}
-
 /*
  * Defined in SNMP-USER-BASED-SM-MIB.txt (RFC 3414)
  */

Reply via email to