From da0b7f9fc0175b7623201728c02fefa2a1d62892 Mon Sep 17 00:00:00 2001
From: Grzegorz Daniluk <grzegorz.daniluk@cern.ch>
Date: Fri, 27 Mar 2020 16:40:39 +0100
Subject: [PATCH] snmp: unify wrsSystemClockStatus with the rest of the
 statuses

Now it represents the overall status of system clock:
- verification with NTP time
- leap seconds file
---
 userspace/snmpd/WR-SWITCH-MIB.txt       |  61 ++---------
 userspace/snmpd/wrsGeneralStatusGroup.c |  16 +--
 userspace/snmpd/wrsTimingStatusGroup.c  | 130 ++++++++++--------------
 userspace/snmpd/wrsTimingStatusGroup.h  |  15 +--
 4 files changed, 72 insertions(+), 150 deletions(-)

diff --git a/userspace/snmpd/WR-SWITCH-MIB.txt b/userspace/snmpd/WR-SWITCH-MIB.txt
index afd345fd5..5c5f4bf9c 100644
--- a/userspace/snmpd/WR-SWITCH-MIB.txt
+++ b/userspace/snmpd/WR-SWITCH-MIB.txt
@@ -323,62 +323,23 @@ wrsSystemClockStatus OBJECT-TYPE
                         na(0),
                         ok(1),
                         error(2),
-                        errorMinor(3),                      
-                        thresholdExceeded(4)
+                        warning(3),                      
+                        warningNA(4)
     }
     MAX-ACCESS     read-only
     STATUS         current
     DESCRIPTION
-            "The system clock is compared to NTP time  
-            ok - system clock is under the threshold value
-            thresholdExceeded - system clock has exceeded the threshold value
-            error - Unexpected status
-            warningNA - there is N/A in one of object used to calculate this value"
+            "Grouped status of system clock
+            ok - system clock is withing threshold (set in WRS configuration)
+                 to NTP time and correct leap seconds file was loaded
+            error - system clock problem, either it diverged or incorrect leap
+                 seconds file is used
+            warning - leapseconds file is not valid anymore and should be
+                 updated
+            warningNA - some information could not be retrieved to calculate the
+                 value of this object"
     ::= { wrsTimingStatusGroup 5 }
 
-wrsLeapSecStatus OBJECT-TYPE
-    SYNTAX         INTEGER {
-                        na(0),
-                        ok(1),                        
-                        error(2),
-                        errorMinor(3),
-                        warning(4) 
-    }
-    MAX-ACCESS     read-only
-    STATUS         current
-    DESCRIPTION
-            "Leap second status
-            ok -  Everything ok
-            leapSecFileExpired - The current leap second file is out-dated
-            internalErrorDetected - Internal error detected (system,...)
-            taiReadError - Cannot read the TAI time
-            leaSecInserted - A leap second will be inserted at 00:00 
-            leapSecDeleted - A leap second will be deleted at 00:00
-            errorMinor - cannot read the status file, problem is probably somewhere else"
-    ::= { wrsTimingStatusGroup 6 }
-
-wrsLeapSecSourceStatus OBJECT-TYPE
-    SYNTAX         INTEGER {
-                        na(0),
-                        ok(1),
-                        error(2),
-                        errorMinor(3)
-                    }
-    MAX-ACCESS     read-only
-    STATUS         current
-    DESCRIPTION
-            "Download status of the leap seconds file
-             ok - Everything is OK
-             updated  - Local leap seconds file has been updated
-             dhcpError - DHCP error detected
-             invalidUrl - The URL is not reachable or invalid
-             invalidFile - The download file is invalid
-             downloadError - Error detected during the download
-             errorMinor - cannot read the status file, problem is probably somewhere
-                     else"
-    ::= { wrsTimingStatusGroup 7 }
-
-
 -- wrsNetworkingStatusGroup (.6.2.3)
 wrsNetworkingStatusGroup   OBJECT IDENTIFIER ::= { wrsDetailedStatusesGroup 3 }
 
diff --git a/userspace/snmpd/wrsGeneralStatusGroup.c b/userspace/snmpd/wrsGeneralStatusGroup.c
index a1402f373..4a4030644 100644
--- a/userspace/snmpd/wrsGeneralStatusGroup.c
+++ b/userspace/snmpd/wrsGeneralStatusGroup.c
@@ -98,20 +98,13 @@ time_t wrsGeneralStatus_data_fill(void)
 		|| t->wrsSlaveLinksStatus == WRS_SLAVE_LINK_STATUS_ERROR
 		|| t->wrsPTPFramesFlowing == WRS_PTP_FRAMES_FLOWING_ERROR
 		|| t->wrsSystemClockStatus == WRS_SYSTEM_CLOCK_STATUS_ERROR
-		|| t->wrsSystemClockStatus == WRS_SYSTEM_CLOCK_STATUS_THRESHOLD_EXCEEDED
-		|| t->wrsLeapSecStatus == WRS_LEAP_SEC_STATUS_ERROR
-		|| t->wrsLeapSecSourceStatus==WRS_LEAP_SEC_SRC_STATUS_ERROR
 	) {
 		wrsGeneralStatus_s.wrsTimingStatus =
 						WRS_TIMING_STATUS_ERROR;
 
 	} else if ( /* check if warning */
 		   t->wrsSoftPLLStatus == WRS_SOFTPLL_STATUS_WARNING
-		|| t->wrsLeapSecStatus == WRS_LEAP_SEC_STATUS_ERROR_MINOR
-		|| t->wrsLeapSecSourceStatus == WRS_LEAP_SEC_SRC_STATUS_ERROR_MINOR
-		|| t->wrsLeapSecStatus == WRS_LEAP_SEC_STATUS_ERROR_MINOR
-		|| t->wrsLeapSecStatus == WRS_LEAP_SEC_STATUS_WARNING
-		|| t->wrsSystemClockStatus == WRS_SYSTEM_CLOCK_STATUS_ERROR_MINOR
+		|| t->wrsSystemClockStatus == WRS_SYSTEM_CLOCK_STATUS_WARNING
 	) { /* warning */
 		wrsGeneralStatus_s.wrsTimingStatus =
 						WRS_TIMING_STATUS_WARNING;
@@ -124,9 +117,8 @@ time_t wrsGeneralStatus_data_fill(void)
 		|| t->wrsSlaveLinksStatus == WRS_SLAVE_LINK_STATUS_WARNING_NA
 		|| t->wrsPTPFramesFlowing == 0
 		|| t->wrsPTPFramesFlowing == WRS_PTP_FRAMES_FLOWING_WARNING_NA
-		|| t->wrsLeapSecStatus == 0
 		|| t->wrsSystemClockStatus == 0
-		|| t->wrsLeapSecSourceStatus == 0
+		|| t->wrsSystemClockStatus == WRS_SYSTEM_CLOCK_STATUS_WARNING_NA
 	) { /* warning NA */
 		wrsGeneralStatus_s.wrsTimingStatus =
 					      WRS_TIMING_STATUS_WARNING_NA;
@@ -138,9 +130,7 @@ time_t wrsGeneralStatus_data_fill(void)
 		&& t->wrsSlaveLinksStatus == WRS_SLAVE_LINK_STATUS_OK
 		&& (t->wrsPTPFramesFlowing == WRS_PTP_FRAMES_FLOWING_OK
 		    || t->wrsPTPFramesFlowing == WRS_PTP_FRAMES_FLOWING_FR) /* FR */
-		&& (t->wrsSystemClockStatus==WRS_SYSTEM_CLOCK_STATUS_OK)
-		&& t->wrsLeapSecStatus == WRS_LEAP_SEC_STATUS_OK
-		&& t->wrsLeapSecSourceStatus == WRS_LEAP_SEC_SRC_STATUS_OK
+		&& t->wrsSystemClockStatus == WRS_SYSTEM_CLOCK_STATUS_OK
 
 	) { /* OK */
 		wrsGeneralStatus_s.wrsTimingStatus =
diff --git a/userspace/snmpd/wrsTimingStatusGroup.c b/userspace/snmpd/wrsTimingStatusGroup.c
index 964f18c02..6097fbd6d 100644
--- a/userspace/snmpd/wrsTimingStatusGroup.c
+++ b/userspace/snmpd/wrsTimingStatusGroup.c
@@ -24,8 +24,6 @@ static struct pickinfo wrsTimingStatus_pickinfo[] = {
 	FIELD(wrsTimingStatus_s, ASN_INTEGER, wrsSlaveLinksStatus),
 	FIELD(wrsTimingStatus_s, ASN_INTEGER, wrsPTPFramesFlowing),
 	FIELD(wrsTimingStatus_s, ASN_INTEGER, wrsSystemClockStatus),
-	FIELD(wrsTimingStatus_s, ASN_INTEGER, wrsLeapSecStatus),
-	FIELD(wrsTimingStatus_s, ASN_INTEGER, wrsLeapSecSourceStatus),
 };
 
 struct wrsTimingStatus_s wrsTimingStatus_s;
@@ -40,8 +38,6 @@ static void get_wrsSoftPLLStatus();
 static void get_wrsSlaveLinksStatus(unsigned int port_status_nrows);
 static void get_wrsPTPFramesFlowing(unsigned int port_status_nrows);
 static void get_wrsSystemClockStatus(void);
-static void get_wrsLeapSecondStatus(void);
-static void get_wrsLeapSecondSourceStatus(void);
 
 time_t wrsTimingStatus_data_fill(void)
 {
@@ -109,9 +105,7 @@ time_t wrsTimingStatus_data_fill(void)
 	}
 
 	if ( time_current_time > time_update) {
-		get_wrsLeapSecondStatus();
 		get_wrsSystemClockStatus();
-		get_wrsLeapSecondSourceStatus();
 	}
 
 	/* save the time of the last ptp_data copy */
@@ -344,78 +338,66 @@ static void get_wrsSoftPLLStatus(void)
 
 static void get_wrsSystemClockStatus(void){
 	struct wrsCurrentTime_s *t=&wrsCurrentTime_s;
+	struct wrsSpllStatus_s  *s=&wrsSpllStatus_s;
 	int status=0;
 
-	switch (t->wrsSystemClockStatusDetails) {
-		case WRS_SYSTEM_CLOCK_STATUS_DETAILS_OK :
-			status=WRS_SYSTEM_CLOCK_STATUS_OK;
-			break;
-		case WRS_SYSTEM_CLOCK_STATUS_DETAILS_IO_ERROR :
-			status=WRS_SYSTEM_CLOCK_STATUS_ERROR_MINOR;
-			break;
-		case WRS_SYSTEM_CLOCK_STATUS_DETAILS_UNKNOWN  :
-		case WRS_SYSTEM_CLOCK_STATUS_DETAILS_ERROR  :
-		case WRS_SYSTEM_CLOCK_STATUS_DETAILS_NTP_ERROR  :
-			status=WRS_SYSTEM_CLOCK_STATUS_ERROR;
-			break;
-		case WRS_SYSTEM_CLOCK_STATUS_DETAILS_THRESHOLD_EXCEEDED :
-			status=WRS_SYSTEM_CLOCK_STATUS_THRESHOLD_EXCEEDED;
-			break;
-	}
-	wrsTimingStatus_s.wrsSystemClockStatus = status;
-}
-
-static void get_wrsLeapSecondStatus(void){
+	status = WRS_SYSTEM_CLOCK_STATUS_OK;
+	/* systemClockStatus is OK when everything is ok with with SystemClock
+	 * monitoring */
+	if ( t->wrsSystemClockStatusDetails == WRS_SYSTEM_CLOCK_STATUS_DETAILS_OK &&
+	     /* and LeapSec file has correct syntax */
+	     (t->wrsLeapSecStatusDetails == WRS_LEAP_SEC_STATUS_DETAILS_OK           ||
+	      t->wrsLeapSecStatusDetails == WRS_LEAP_SEC_STATUS_DETAILS_SEC_INSERTED ||
+	      t->wrsLeapSecStatusDetails == WRS_LEAP_SEC_STATUS_DETAILS_SEC_DELETED  ||
+	       /* if LeapSec file is expired it matters only for GM or FreeRunning
+	        * Master */
+	      (t->wrsLeapSecStatusDetails == WRS_LEAP_SEC_STATUS_DETAILS_FILE_EXPIRED
+	       && s->wrsSpllMode != WRS_SPLL_MODE_GRAND_MASTER
+	       && s->wrsSpllMode != WRS_SPLL_MODE_MASTER)
+	     ) &&
+	     /* and LeapSec file was retrieved successfully */ 
+	     (t->wrsLeapSecSourceStatusDetails == WRS_LEAP_SEC_SRC_STATUS_DETAILS_OK ||
+	      t->wrsLeapSecSourceStatusDetails == WRS_LEAP_SEC_SRC_STATUS_DETAILS_UPDATED)
+	   )
+		status = WRS_SYSTEM_CLOCK_STATUS_OK;
+	/* ERROR */
+	else if (
+	     t->wrsSystemClockStatusDetails == WRS_SYSTEM_CLOCK_STATUS_DETAILS_NTP_ERROR ||
+	     t->wrsSystemClockStatusDetails == WRS_SYSTEM_CLOCK_STATUS_DETAILS_THRESHOLD_EXCEEDED ||
+	     t->wrsLeapSecStatusDetails == WRS_LEAP_SEC_STATUS_DETAILS_INTERNAL_ERROR    ||
+	     t->wrsLeapSecStatusDetails == WRS_LEAP_SEC_STATUS_DETAILS_TAI_READ_ERROR    ||
+	     t->wrsLeapSecSourceStatusDetails == WRS_LEAP_SEC_SRC_STATUS_DETAILS_INVALID_URL ||
+	     t->wrsLeapSecSourceStatusDetails == WRS_LEAP_SEC_SRC_STATUS_DETAILS_INVALID_FILE ||
+	     /* download error only for configured "force remote" */
+	     (t->wrsLeapSecSourceStatusDetails == WRS_LEAP_SEC_SRC_STATUS_DETAILS_DOWNLOAD_ERROR &&
+	      t->wrsLeapSecSource == WRS_LEAP_SEC_SOURCE_FORCE_REMOTE)                   ||
+	     /* dhcp error only for configured "force remote" */
+	     (t->wrsLeapSecSourceStatusDetails == WRS_LEAP_SEC_SRC_STATUS_DETAILS_DHCP_ERROR &&
+	      t->wrsLeapSecSource == WRS_LEAP_SEC_SOURCE_FORCE_REMOTE)
+	     )
+		status = WRS_SYSTEM_CLOCK_STATUS_ERROR;
+	/* Warning */
+	else if (
+	     /* Leapsecond file expired counts for GM or FM modes */
+	     (t->wrsLeapSecStatusDetails == WRS_LEAP_SEC_STATUS_DETAILS_FILE_EXPIRED
+	       && s->wrsSpllMode == WRS_SPLL_MODE_GRAND_MASTER)                      ||
+	     (t->wrsLeapSecStatusDetails == WRS_LEAP_SEC_STATUS_DETAILS_FILE_EXPIRED
+	       && s->wrsSpllMode == WRS_SPLL_MODE_MASTER)
+	     )
+		status = WRS_SYSTEM_CLOCK_STATUS_WARNING;
+	/* WarningNA */
+	else if (
+	     t->wrsSystemClockStatusDetails == WRS_SYSTEM_CLOCK_STATUS_DETAILS_IO_ERROR   ||
+	     t->wrsSystemClockStatusDetails == WRS_SYSTEM_CLOCK_STATUS_DETAILS_UNKNOWN    ||
+	     t->wrsLeapSecStatusDetails == WRS_LEAP_SEC_STATUS_DETAILS_IO_ERROR		  ||
+	     t->wrsLeapSecStatusDetails == WRS_LEAP_SEC_STATUS_DETAILS_UNKNOWN		  ||
+	     t->wrsLeapSecSourceStatusDetails == WRS_LEAP_SEC_SRC_STATUS_DETAILS_IO_ERROR ||
+	     t->wrsLeapSecSourceStatusDetails == WRS_LEAP_SEC_SRC_STATUS_DETAILS_UNKNOWN
+	     )
+		status = WRS_SYSTEM_CLOCK_STATUS_WARNING_NA;
 
-	struct wrsCurrentTime_s *t=&wrsCurrentTime_s;
-	struct wrsSpllStatus_s *s=&wrsSpllStatus_s;
-	int status=0;
 
-	switch (t->wrsLeapSecStatusDetails ) {
-	case WRS_LEAP_SEC_STATUS_DETAILS_OK :
-	case WRS_LEAP_SEC_STATUS_DETAILS_SEC_INSERTED:
-	case WRS_LEAP_SEC_STATUS_DETAILS_SEC_DELETED:
-		status=WRS_LEAP_SEC_STATUS_OK;
-		break;
-	case WRS_LEAP_SEC_STATUS_DETAILS_IO_ERROR:
-		status=WRS_LEAP_SEC_STATUS_ERROR_MINOR;
-		break;
-	case WRS_LEAP_SEC_STATUS_DETAILS_UNKNOWN:
-	case WRS_LEAP_SEC_STATUS_DETAILS_INTERNAL_ERROR:
-	case WRS_LEAP_SEC_STATUS_DETAILS_TAI_READ_ERROR:
-		status=WRS_LEAP_SEC_STATUS_ERROR;
-		break;
-	case WRS_LEAP_SEC_STATUS_DETAILS_FILE_EXPIRED:
-		status = ( s->wrsSpllMode == WRS_SPLL_MODE_GRAND_MASTER
-				|| s->wrsSpllMode == WRS_SPLL_MODE_MASTER)
-			? WRS_LEAP_SEC_STATUS_WARNING : WRS_LEAP_SEC_STATUS_DETAILS_OK;
-		break;
-	}
-	wrsTimingStatus_s.wrsLeapSecStatus = status;
-}
-
-static void get_wrsLeapSecondSourceStatus(void){
-
-	struct wrsCurrentTime_s *t=&wrsCurrentTime_s;
-	int status=0;
-
-	switch (t->wrsLeapSecSourceStatusDetails ) {
-	case WRS_LEAP_SEC_SRC_STATUS_DETAILS_OK :
-	case WRS_LEAP_SEC_SRC_STATUS_DETAILS_UPDATED:
-		status = WRS_LEAP_SEC_SRC_STATUS_OK;
-		break;
-	case WRS_LEAP_SEC_SRC_STATUS_DETAILS_IO_ERROR:
-		status = WRS_LEAP_SEC_SRC_STATUS_ERROR_MINOR;
-		break;
-	case WRS_LEAP_SEC_SRC_STATUS_DETAILS_UNKNOWN:
-	case WRS_LEAP_SEC_SRC_STATUS_DETAILS_DHCP_ERROR:
-	case WRS_LEAP_SEC_SRC_STATUS_DETAILS_INVALID_URL:
-	case WRS_LEAP_SEC_SRC_STATUS_DETAILS_INVALID_FILE:
-	case WRS_LEAP_SEC_SRC_STATUS_DETAILS_DOWNLOAD_ERROR:
-		status = WRS_LEAP_SEC_SRC_STATUS_ERROR;
-		break;
-	}
-	wrsTimingStatus_s.wrsLeapSecSourceStatus = status;
+	wrsTimingStatus_s.wrsSystemClockStatus = status;
 }
 
 static void get_wrsSlaveLinksStatus(unsigned int port_status_nrows)
diff --git a/userspace/snmpd/wrsTimingStatusGroup.h b/userspace/snmpd/wrsTimingStatusGroup.h
index ff75720e0..2c7a6cff9 100644
--- a/userspace/snmpd/wrsTimingStatusGroup.h
+++ b/userspace/snmpd/wrsTimingStatusGroup.h
@@ -30,17 +30,8 @@
 
 #define WRS_SYSTEM_CLOCK_STATUS_OK                 1		/* ok */
 #define WRS_SYSTEM_CLOCK_STATUS_ERROR              2		/* error */
-#define WRS_SYSTEM_CLOCK_STATUS_ERROR_MINOR        3		/* error minor */
-#define WRS_SYSTEM_CLOCK_STATUS_THRESHOLD_EXCEEDED 4		/* Threshold exceeded */
-
-#define WRS_LEAP_SEC_STATUS_OK                 1		/* Everything ok */
-#define WRS_LEAP_SEC_STATUS_ERROR              2		/* Error detected */
-#define WRS_LEAP_SEC_STATUS_ERROR_MINOR        3		/* Minor error detected */
-#define WRS_LEAP_SEC_STATUS_WARNING		       4		/* The current leap second file is out-dated */
-
-#define WRS_LEAP_SEC_SRC_STATUS_OK                 1		/* Everything ok  */
-#define WRS_LEAP_SEC_SRC_STATUS_ERROR              2		/* Error detected */
-#define WRS_LEAP_SEC_SRC_STATUS_ERROR_MINOR        3		/* Minor error detected */
+#define WRS_SYSTEM_CLOCK_STATUS_WARNING		   3		/* warning */
+#define WRS_SYSTEM_CLOCK_STATUS_WARNING_NA	   4		/* not all data is available to calculate status*/
 
 struct wrsTimingStatus_s {
 	int wrsPTPStatus;
@@ -48,8 +39,6 @@ struct wrsTimingStatus_s {
 	int wrsSlaveLinksStatus;
 	int wrsPTPFramesFlowing;
 	int wrsSystemClockStatus;
-	int wrsLeapSecSourceStatus;
-	int wrsLeapSecStatus;
 };
 
 extern struct wrsTimingStatus_s wrsTimingStatus_s;
-- 
GitLab