From ac5d1bb3eaf4c98e3a71e21f0cee4e9e68e0fbbb Mon Sep 17 00:00:00 2001 From: harti Date: Wed, 2 Nov 2005 14:05:49 +0000 Subject: [PATCH] Vendor patch: fix the reporting of ifOperStatus. We now consider an interface up when it is running AND the link is not down (that is, it is up or unknown). If the interface is running but the link is down, we return state 'dormant', because we're waiting for an external event. Otherwise the interface is 'down'. Submitted by: csjp Reviewed by: glebius --- contrib/bsnmp/snmp_mibII/mibII_interfaces.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/contrib/bsnmp/snmp_mibII/mibII_interfaces.c b/contrib/bsnmp/snmp_mibII/mibII_interfaces.c index 1c0826007626..d3211d01192a 100644 --- a/contrib/bsnmp/snmp_mibII/mibII_interfaces.c +++ b/contrib/bsnmp/snmp_mibII/mibII_interfaces.c @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Begemot: bsnmp/snmp_mibII/mibII_interfaces.c,v 1.15 2005/05/23 09:03:39 brandt_h Exp $ + * $Begemot: bsnmp/snmp_mibII/mibII_interfaces.c,v 1.16 2005/11/02 12:07:40 brandt_h Exp $ * * Interfaces group. */ @@ -280,8 +280,22 @@ op_ifentry(struct snmp_context *ctx, struct snmp_value *value, break; case LEAF_ifOperStatus: - value->v.integer = - (ifp->mib.ifmd_flags & IFF_RUNNING) ? 1 : 2; + /* + * According to RFC 2863 the state should be Up if the + * interface is ready to transmit packets. We takes this to + * mean that the interface should be running and should have + * a carrier. If it is running and has no carrier we interpret + * this as 'waiting for an external event' (plugging in the + * cable) and hence return 'dormant'. + */ + if (ifp->mib.ifmd_flags & IFF_RUNNING) { + if (ifp->mib.ifmd_data.ifi_link_state == + LINK_STATE_DOWN) + value->v.integer = 5; /* state dormant */ + else + value->v.integer = 1; /* state up */ + } else + value->v.integer = 2; /* state down */ break; case LEAF_ifLastChange: