Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 20db51d70e6b59a061db97ce9b89c771 > files > 64

net-snmp-5.3.2.2-14.el5.src.rpm

583807 - linkUpDownNotifications does not behave as described in snmpd.conf man page

commit 56cd514b3e1b204f3087e751be8ca7d742d6408d
Author: dts12 <dts12@06827809-a52a-0410-b366-d66718629ded>
Date:   Sun Jun 1 20:02:27 2008 +0000

    Handle varbind payload for internal linkUp/Down notifications.
    
    
    git-svn-id: https://net-snmp.svn.sourceforge.net/svnroot/net-snmp/branches/V5-4-patches@16984 06827809-a52a-0410-b366-d66718629ded

diff --git a/net-snmp/agent/mibgroup/disman/event/mteEvent.c b/net-snmp/agent/mibgroup/disman/event/mteEvent.c
index 9ad52bd..327f8ba 100644
--- net-snmp/agent/mibgroup/disman/event/mteEvent.c
+++ net-snmp/agent/mibgroup/disman/event/mteEvent.c
@@ -43,6 +43,13 @@ init_mteEvent(void)
 
     /*
      * Insert fixed events for the default trigger notifications
+     *
+     * NB: internal events (with an owner of "_snmpd") will not in
+     * fact refer to the mteObjectsTable for the payload varbinds.
+     * The routine mteObjects_internal_vblist() hardcodes the
+     * appropriate varbinds for these internal events.
+     *   This routine will need to be updated whenever a new
+     * internal event is added.
      */
     if ( _defaults_init)
         return;
@@ -267,6 +274,7 @@ mteEvent_fire( char *owner, char *event,      /* Event to invoke    */
 }
 
 
+#ifdef __NOT_NEEDED
 void
 _insert_internal_objects( netsnmp_variable_list *vblist, char *oname,
                           struct mteTrigger *trigger)
@@ -322,6 +330,7 @@ _insert_internal_objects( netsnmp_variable_list *vblist, char *oname,
     vp->next_variable     = vblist->next_variable;
     vblist->next_variable = var;
 }
+#endif
 
 int
 _mteEvent_fire_notify( struct mteEvent   *entry,     /* The event to fire  */
@@ -331,6 +340,8 @@ _mteEvent_fire_notify( struct mteEvent   *entry,     /* The event to fire  */
     netsnmp_variable_list *var, *v2;
     oid    snmptrap_oid[]   = { 1,3,6,1,6,3,1,1,4,1,0 };
     size_t snmptrap_oid_len = OID_LENGTH(snmptrap_oid);
+    netsnmp_session *s;
+
          /*
           * The Event-MIB specification says that objects from the
           *   mteEventTable should come after those from the trigger,
@@ -394,9 +405,10 @@ _mteEvent_fire_notify( struct mteEvent   *entry,     /* The event to fire  */
      */
     v2 = var->next_variable;
     if (entry->session)
-        netsnmp_query_get( v2, entry->session );
+        s = entry->session;
     else
-        netsnmp_query_get( v2, trigger->session );
+        s = trigger->session;
+    netsnmp_query_get( v2, s );
 
     /*
      * ... add any "internal" objects...
@@ -405,11 +417,11 @@ _mteEvent_fire_notify( struct mteEvent   *entry,     /* The event to fire  */
     if (strcmp(entry->mteNotifyOwner, "_snmpd") == 0) {
         DEBUGMSGTL(("disman:event:fire", "Adding event objects (internal)\n"));
         if ( !strictOrdering ) {
-            mteObjects_internal_vblist(var, entry->mteNotifyObjects, trigger);
+            mteObjects_internal_vblist(var, entry->mteNotifyObjects, trigger, s);
         } else {
             for (v2 = var; v2 && v2->next_variable; v2=v2->next_variable)
                 ;
-            mteObjects_internal_vblist(v2, entry->mteNotifyObjects, trigger);
+            mteObjects_internal_vblist(v2,  entry->mteNotifyObjects, trigger, s);
         }
     }
 
diff --git a/net-snmp/agent/mibgroup/disman/event/mteObjects.c b/net-snmp/agent/mibgroup/disman/event/mteObjects.c
index bf9cbc9..b867bc3 100644
--- net-snmp/agent/mibgroup/disman/event/mteObjects.c
+++ net-snmp/agent/mibgroup/disman/event/mteObjects.c
@@ -335,7 +335,9 @@ mteObjects_vblist( netsnmp_variable_list *vblist,
 
 int
 mteObjects_internal_vblist( netsnmp_variable_list *vblist,
-                            char   *oname, struct mteTrigger *trigger)
+                            char   *oname,
+                            struct mteTrigger *trigger,
+                            netsnmp_session   *sess)
 {
     netsnmp_variable_list *var = NULL, *vp;
     oid mteHotTrigger[] = {1, 3, 6, 1, 2, 1, 88, 2, 1, 1, 0};
@@ -344,6 +346,12 @@ mteObjects_internal_vblist( netsnmp_variable_list *vblist,
     oid mteHotOID[]     = {1, 3, 6, 1, 2, 1, 88, 2, 1, 4, 0};
     oid mteHotValue[]   = {1, 3, 6, 1, 2, 1, 88, 2, 1, 5, 0};
 
+    oid ifIndexOid[]    = {1, 3, 6, 1, 2, 1, 2, 2, 1, 1, 0};
+    oid ifAdminStatus[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 7, 0};
+    oid ifOperStatus[]  = {1, 3, 6, 1, 2, 1, 2, 2, 1, 8, 0};
+
+    oid if_index;
+
     /*
      * Construct the varbinds for this (internal) event...
      */
@@ -370,6 +378,41 @@ mteObjects_internal_vblist( netsnmp_variable_list *vblist,
                               trigger->mteTriggerFired->type,
                               trigger->mteTriggerFired->val.string,
                               trigger->mteTriggerFired->val_len);
+    } else if ((!strcmp(oname, "_linkUpDown"  ))) {
+        /*
+         * The ifOperStatus varbind that triggered this entry
+         *  is held in the trigger->mteTriggerFired field
+         *
+         * We can retrieve the ifIndex and ifOperStatus values
+         *  from this varbind.  But first we need to tweak the
+         *  static ifXXX OID arrays to include the correct index.
+         *  (or this could be passed in from the calling routine?)
+         *
+         * Unfortunately we don't have the current AdminStatus value,
+         *  so we'll need to make another query to retrieve that.
+         */
+        if_index = trigger->mteTriggerFired->name[10];
+        ifIndexOid[    10 ] = if_index;
+        ifAdminStatus[ 10 ] = if_index;
+        ifOperStatus[  10 ] = if_index;
+        snmp_varlist_add_variable( &var,
+               ifIndexOid, OID_LENGTH(ifIndexOid),
+               ASN_INTEGER, &if_index, sizeof(if_index));
+
+               /* Set up a dummy varbind for ifAdminStatus... */
+        snmp_varlist_add_variable( &var,
+               ifAdminStatus, OID_LENGTH(ifAdminStatus),
+               ASN_INTEGER,
+               trigger->mteTriggerFired->val.integer,
+               trigger->mteTriggerFired->val_len);
+               /* ... then retrieve the actual value */
+        netsnmp_query_get( var->next_variable, sess );
+
+        snmp_varlist_add_variable( &var,
+               ifOperStatus, OID_LENGTH(ifOperStatus),
+               ASN_INTEGER,
+               trigger->mteTriggerFired->val.integer,
+               trigger->mteTriggerFired->val_len);
     } else {
         DEBUGMSGTL(("disman:event:objects",
                     "Unknown internal objects tag (%s)\n", oname));
diff --git a/net-snmp/agent/mibgroup/disman/event/mteObjects.h b/net-snmp/agent/mibgroup/disman/event/mteObjects.h
index 7c79460..e0c6ff6 100644
--- net-snmp/agent/mibgroup/disman/event/mteObjects.h
+++ net-snmp/agent/mibgroup/disman/event/mteObjects.h
@@ -53,6 +53,7 @@ int  mteObjects_vblist(          netsnmp_variable_list *vblist,
                                  char *owner,   char   *oname,
                                  oid  *suffix,  size_t  sfx_len );
 int  mteObjects_internal_vblist( netsnmp_variable_list *vblist,
-                                 char *oname,   struct mteTrigger *trigger);
+                                 char *oname,   struct mteTrigger *trigger,
+                                 netsnmp_session *s);
 
 #endif                          /* MTEOBJECTS_H */