Similar reasoning and questions as the move of SNMPv2-MIB::snmp.
This moves SNMP-FRAMEWORK-MIB::snmpEngine and
SNMP-USER-BASED-SM-MIB::usmStats from mib.c to application_internal.c,
under SNMPv2-SMI::snmpV2. The reason for this broader umbrella is that
other backends have no business fiddling around under this region.
Since different backends bite eachother with exclusive regions, both
snmpEngine and usmStats must be moved at the same time.

This change also breaks snmpd.sh from regress. This places a few custom
OIDs in the usmUserTable, which is under snmpV2. Since these tests are
mostly there to test snmp(1) I think it's worth removing these tests and
build a proper snmp(1) regress suite another day (regress part in next
mail)

OK?

martijn@

diff --git a/application_internal.c b/application_internal.c
index c76e8ef..36ab8ef 100644
--- a/application_internal.c
+++ b/application_internal.c
@@ -45,6 +45,8 @@ void appl_internal_get(struct appl_backend *, int32_t, 
int32_t, const char *,
 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 ber_element *appl_internal_engine(struct ber_oid *);
+struct ber_element *appl_internal_usmstats(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 *);
@@ -128,6 +130,29 @@ appl_internal_init(void)
            NULL);
        appl_internal_object(&OID(MIB_snmpProxyDrops), appl_internal_snmp,
            NULL);
+
+       appl_internal_region(&OID(MIB_snmpV2));
+       appl_internal_object(&OID(MIB_snmpEngineID), appl_internal_engine,
+           NULL);
+       appl_internal_object(&OID(MIB_snmpEngineBoots), appl_internal_engine,
+           NULL);
+       appl_internal_object(&OID(MIB_snmpEngineTime), appl_internal_engine,
+           NULL);
+       appl_internal_object(&OID(MIB_snmpEngineMaxMsgSize),
+           appl_internal_engine, NULL);
+
+       appl_internal_object(&OID(MIB_usmStatsUnsupportedSecLevels),
+           appl_internal_usmstats, NULL);
+       appl_internal_object(&OID(MIB_usmStatsNotInTimeWindow),
+           appl_internal_usmstats, NULL);
+       appl_internal_object(&OID(MIB_usmStatsUnknownUserNames),
+           appl_internal_usmstats, NULL);
+       appl_internal_object(&OID(MIB_usmStatsUnknownEngineId),
+           appl_internal_usmstats, NULL);
+       appl_internal_object(&OID(MIB_usmStatsWrongDigests),
+           appl_internal_usmstats, NULL);
+       appl_internal_object(&OID(MIB_usmStatsDecryptionErrors),
+           appl_internal_usmstats, NULL);
 }
 
 void
@@ -376,6 +401,46 @@ appl_internal_snmp(struct ber_oid *oid)
        return value;
 }
 
+struct ber_element *
+appl_internal_engine(struct ber_oid *oid)
+{
+       if (ober_oid_cmp(&OID(MIB_snmpEngineID, 0), oid) == 0)
+               return ober_add_nstring(NULL, snmpd_env->sc_engineid,
+                   snmpd_env->sc_engineid_len);
+       else if (ober_oid_cmp(&OID(MIB_snmpEngineBoots, 0), oid) == 0)
+               return ober_add_integer(NULL, snmpd_env->sc_engine_boots);
+       else if (ober_oid_cmp(&OID(MIB_snmpEngineTime, 0), oid) == 0)
+               return ober_add_integer(NULL, snmpd_engine_time());
+       else if (ober_oid_cmp(&OID(MIB_snmpEngineMaxMsgSize, 0), oid) == 0)
+               return ober_add_integer(NULL, READ_BUF_SIZE);
+       return NULL;
+}
+
+struct ber_element *
+appl_internal_usmstats(struct ber_oid *oid)
+{
+       struct snmp_stats *stats = &snmpd_env->sc_stats;
+       struct ber_element *value = NULL;
+
+       if (ober_oid_cmp(&OID(MIB_usmStatsUnsupportedSecLevels, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_usmbadseclevel);
+       else if (ober_oid_cmp(&OID(MIB_usmStatsNotInTimeWindow, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_usmtimewindow);
+       else if (ober_oid_cmp(&OID(MIB_usmStatsUnknownUserNames, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_usmnosuchuser);
+       else if (ober_oid_cmp(&OID(MIB_usmStatsUnknownEngineId, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_usmnosuchengine);
+       else if (ober_oid_cmp(&OID(MIB_usmStatsWrongDigests, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_usmwrongdigest);
+       else if (ober_oid_cmp(&OID(MIB_usmStatsDecryptionErrors, 0), oid) == 0)
+               value = ober_add_integer(NULL, stats->snmp_usmdecrypterr);
+
+       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 ef34983..481460c 100644
--- a/mib.c
+++ b/mib.c
@@ -216,79 +216,6 @@ mib_sysor(struct oid *oid, struct ber_oid *o, struct 
ber_element **elm)
        return (0);
 }
 
-/*
- * Defined in SNMP-USER-BASED-SM-MIB.txt (RFC 3414)
- */
-int     mib_engine(struct oid *, struct ber_oid *, struct ber_element **);
-int     mib_usmstats(struct oid *, struct ber_oid *, struct ber_element **);
-
-static struct oid usm_mib[] = {
-       { MIB(snmpEngine),                      OID_MIB },
-       { MIB(snmpEngineID),                    OID_RD, mib_engine },
-       { MIB(snmpEngineBoots),                 OID_RD, mib_engine },
-       { MIB(snmpEngineTime),                  OID_RD, mib_engine },
-       { MIB(snmpEngineMaxMsgSize),            OID_RD, mib_engine },
-       { MIB(usmStats),                        OID_MIB },
-       { MIB(usmStatsUnsupportedSecLevels),    OID_RD, mib_usmstats },
-       { MIB(usmStatsNotInTimeWindow),         OID_RD, mib_usmstats },
-       { MIB(usmStatsUnknownUserNames),        OID_RD, mib_usmstats },
-       { MIB(usmStatsUnknownEngineId),         OID_RD, mib_usmstats },
-       { MIB(usmStatsWrongDigests),            OID_RD, mib_usmstats },
-       { MIB(usmStatsDecryptionErrors),        OID_RD, mib_usmstats },
-       { MIBEND }
-};
-
-int
-mib_engine(struct oid *oid, struct ber_oid *o, struct ber_element **elm)
-{
-       switch (oid->o_oid[OIDIDX_snmpEngine]) {
-       case 1:
-               *elm = ober_add_nstring(*elm, snmpd_env->sc_engineid,
-                   snmpd_env->sc_engineid_len);
-               break;
-       case 2:
-               *elm = ober_add_integer(*elm, snmpd_env->sc_engine_boots);
-               break;
-       case 3:
-               *elm = ober_add_integer(*elm, snmpd_engine_time());
-               break;
-       case 4:
-               *elm = ober_add_integer(*elm, READ_BUF_SIZE);
-               break;
-       default:
-               return -1;
-       }
-       return 0;
-}
-
-int
-mib_usmstats(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[] = {
-               { OIDVAL_usmErrSecLevel,        &stats->snmp_usmbadseclevel },
-               { OIDVAL_usmErrTimeWindow,      &stats->snmp_usmtimewindow },
-               { OIDVAL_usmErrUserName,        &stats->snmp_usmnosuchuser },
-               { OIDVAL_usmErrEngineId,        &stats->snmp_usmnosuchengine },
-               { OIDVAL_usmErrDigest,          &stats->snmp_usmwrongdigest },
-               { OIDVAL_usmErrDecrypt,         &stats->snmp_usmdecrypterr },
-       };
-
-       for (i = 0; (u_int)i < (sizeof(mapping) / sizeof(mapping[0])); i++) {
-               if (oid->o_oid[OIDIDX_usmStats] == 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);
-}
-
 /*
  * Import all MIBs
  */
@@ -307,7 +234,4 @@ mib_init(void)
 
        /* SNMPv2-MIB */
        smi_mibtree(base_mib);
-
-       /* SNMP-USER-BASED-SM-MIB */
-       smi_mibtree(usm_mib);
 }

Reply via email to