From 3b03ba454d9298bb5c3872e4864cbef38d56cf46 Mon Sep 17 00:00:00 2001 From: Adam Wujek <adam.wujek@cern.ch> Date: Tue, 14 Apr 2015 10:05:29 +0200 Subject: [PATCH] userspace/snmpd: add wrsNetworkingStatus to wrsGeneralStatusGroup Additionally update MIB Signed-off-by: Adam Wujek <adam.wujek@cern.ch> --- userspace/snmpd/WR-SWITCH-MIB.txt | 19 +++++++ userspace/snmpd/wrsGeneralStatusGroup.c | 67 ++++++++++++++++++++++++- userspace/snmpd/wrsGeneralStatusGroup.h | 10 ++++ 3 files changed, 94 insertions(+), 2 deletions(-) diff --git a/userspace/snmpd/WR-SWITCH-MIB.txt b/userspace/snmpd/WR-SWITCH-MIB.txt index b472f69c2..9805b50fb 100644 --- a/userspace/snmpd/WR-SWITCH-MIB.txt +++ b/userspace/snmpd/WR-SWITCH-MIB.txt @@ -73,6 +73,25 @@ wrsOSStatus OBJECT-TYPE bug - bug in checking conditions of wrsOSStatusGroup, please report" ::= { wrsGeneralStatusGroup 2 } +wrsNetworkingStatus OBJECT-TYPE + SYNTAX INTEGER { + na(0), + ok(1), + error(2), + warning(3), + warningNA(4), + bug(5) + } + MAX-ACCESS read-only + STATUS current + DESCRIPTION + "Grouped status of wrsNetworkingStatusGroup + ok - values in wrsNetworkingStatusGroup are correct + error - there is an error in wrsNetworkingStatusGroup + warning - there is a warning in wrsNetworkingStatusGroup + warningNA - there is N/A field in wrsNetworkingStatusGroup + bug - bug in checking conditions of wrsNetworkingStatusGroup, please report" + ::= { wrsGeneralStatusGroup 4 } wrsDetailedStatusesGroup OBJECT IDENTIFIER ::= { wrsStatus 2 } diff --git a/userspace/snmpd/wrsGeneralStatusGroup.c b/userspace/snmpd/wrsGeneralStatusGroup.c index 50dccd38f..43577f0a1 100644 --- a/userspace/snmpd/wrsGeneralStatusGroup.c +++ b/userspace/snmpd/wrsGeneralStatusGroup.c @@ -2,6 +2,7 @@ #include "snmp_shmem.h" #include "wrsCurrentTimeGroup.h" #include "wrsOSStatusGroup.h" +#include "wrsNetworkingStatusGroup.h" #include "wrsPortStatusTable.h" #include "wrsPstatsTable.h" #include "wrsPtpDataTable.h" @@ -14,6 +15,8 @@ static struct pickinfo wrsGeneralStatus_pickinfo[] = { FIELD(wrsGeneralStatus_s, ASN_INTEGER, wrsMainSystemStatus), FIELD(wrsGeneralStatus_s, ASN_INTEGER, wrsOSStatus), + FIELD(wrsGeneralStatus_s, ASN_INTEGER, wrsTimingStatus), + FIELD(wrsGeneralStatus_s, ASN_INTEGER, wrsNetworkingStatus), }; struct wrsGeneralStatus_s wrsGeneralStatus_s; @@ -22,17 +25,24 @@ time_t wrsGeneralStatus_data_fill(void) { static time_t time_update; /* time of last update */ time_t time_osstatus; /* time when wrsOSStatus data was updated */ + time_t time_networking_status; /* time when wrsNetworkingStatus data + * was updated */ struct wrsOSStatus_s *o; + struct wrsNetworkingStatus_s *n; time_osstatus = wrsOSStatus_data_fill(); + time_networking_status = wrsNetworkingStatus_data_fill(); - if (time_osstatus <= time_update) { + if (time_osstatus <= time_update + && time_networking_status <= time_update) { /* cache not updated, return last update time */ snmp_log(LOG_ERR, "SNMP: wrsGeneralStatusGroup cache\n"); return time_update; } + memset(&wrsGeneralStatus_s, 0, sizeof(wrsGeneralStatus_s)); + /*********************************************************************\ |**************************** wrsOSStatus ****************************| \*********************************************************************/ @@ -49,7 +59,7 @@ time_t wrsGeneralStatus_data_fill(void) ) { /* warning */ wrsGeneralStatus_s.wrsOSStatus = WRS_OS_STATUS_WARNING; - } else if ( /* check if any of fields equal to 0 */ + } else if ( /* check if any of fields equal to 0 or WARNING_NA */ o->wrsBootSuccessful == WRS_BOOT_SUCCESSFUL_WARNING_NA || o->wrsBootSuccessful == 0 || o->wrsTemperatureWarning == 0 @@ -67,6 +77,59 @@ time_t wrsGeneralStatus_data_fill(void) wrsGeneralStatus_s.wrsOSStatus = WRS_OS_STATUS_BUG; } + /*********************************************************************\ + |************************** wrsTimingStatus **************************| + \*********************************************************************/ + + /* not implemented */ + + /*********************************************************************\ + |************************ wrsNetworkingStatus ************************| + \*********************************************************************/ + n = &wrsNetworkingStatus_s; + if ( /* check if error */ + n->wrsSFPsStatus == WRS_SFPS_STATUS_ERROR + || n->wrsEndpointStatus == WRS_ENDPOINT_STATUS_ERROR + || n->wrsSwcoreStatus == WRS_SWCORE_STATUS_ERROR + || n->wrsRTUStatus == WRS_RTU_STATUS_ERROR + ) { + wrsGeneralStatus_s.wrsNetworkingStatus = + WRS_NETWORKING_STATUS_ERROR; + + } else if ( /* check if warning */ + n->wrsSFPsStatus == WRS_SFPS_STATUS_WARNING + ) { /* warning */ + wrsGeneralStatus_s.wrsNetworkingStatus = + WRS_NETWORKING_STATUS_WARNING; + + } else if ( /* check if any of fields equal to 0 or WARNING_NA */ + n->wrsSFPsStatus == WRS_SFPS_STATUS_WARNING_NA + || n->wrsSFPsStatus == 0 + || n->wrsEndpointStatus == 0 + || n->wrsSwcoreStatus == 0 + || n->wrsRTUStatus == 0 + ) { /* warning NA */ + wrsGeneralStatus_s.wrsNetworkingStatus = + WRS_NETWORKING_STATUS_WARNING_NA; + + } else if ( /* check if OK, FR (first read) is also ok */ + n->wrsSFPsStatus == WRS_SFPS_STATUS_OK + && (n->wrsEndpointStatus == WRS_ENDPOINT_STATUS_OK + || n->wrsEndpointStatus == WRS_ENDPOINT_STATUS_FR) /* FR*/ + && (n->wrsSwcoreStatus == WRS_SWCORE_STATUS_OK + || n->wrsSwcoreStatus == WRS_SWCORE_STATUS_FR) /* FR */ + && (n->wrsRTUStatus == WRS_RTU_STATUS_OK + || n->wrsRTUStatus == WRS_RTU_STATUS_FR) /* FR */ + ) { /* OK */ + wrsGeneralStatus_s.wrsNetworkingStatus = + WRS_NETWORKING_STATUS_OK; + + } else { /* probably bug in previous conditions, + * this should never happen */ + wrsGeneralStatus_s.wrsNetworkingStatus = + WRS_NETWORKING_STATUS_BUG; + } + time_update = time(NULL); wrsCurrentTime_data_fill(); wrsOSStatus_data_fill(); diff --git a/userspace/snmpd/wrsGeneralStatusGroup.h b/userspace/snmpd/wrsGeneralStatusGroup.h index 8e0674db4..978e63a08 100644 --- a/userspace/snmpd/wrsGeneralStatusGroup.h +++ b/userspace/snmpd/wrsGeneralStatusGroup.h @@ -11,9 +11,19 @@ * normal operation */ #define WRS_OS_STATUS_BUG 5 /* warning */ +#define WRS_NETWORKING_STATUS_OK 1 /* ok */ +#define WRS_NETWORKING_STATUS_ERROR 2 /* error */ +#define WRS_NETWORKING_STATUS_WARNING 3 /* warning */ +#define WRS_NETWORKING_STATUS_WARNING_NA 4 /* warning, at least one field is + * equal to 0 (NA),shouldn't happen in + * normal operation */ +#define WRS_NETWORKING_STATUS_BUG 5 /* warning */ + struct wrsGeneralStatus_s { int wrsMainSystemStatus; int wrsOSStatus; + int wrsTimingStatus; + int wrsNetworkingStatus; }; extern struct wrsGeneralStatus_s wrsGeneralStatus_s; -- GitLab