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 */