Commit 6a3f740f authored by Adam Wujek's avatar Adam Wujek 💬

userspace/snmpd: split wrsTimingStatus_data_fill into several functions

There was a bug in wrsTimingStatus_data_fill that even if not all of the
wrsPtpDataTable_data_fill, wrsSpllStatus_data_fill or
wrsPortStatusTable_data_fill were updated all objects in the
wrsTimingStatusGroup were updated. As a side effect it may happen that all
prev_ values were compared with exactly the same set of data (since there was
no update in particular data). By this delta were zero and wrong value was set.

The bug may be hit when snmp requests rate is lower than snmpd's cache timeout.
Signed-off-by: Adam Wujek's avatarAdam Wujek <adam.wujek@cern.ch>
parent 3f598d11
......@@ -14,32 +14,19 @@ static struct pickinfo wrsTimingStatus_pickinfo[] = {
struct wrsTimingStatus_s wrsTimingStatus_s;
/* store old values of ptp servo error counters and number of updates */
static uint32_t servo_updates_prev[WRS_MAX_N_SERVO_INSTANCES];
static uint32_t n_err_state_prev[WRS_MAX_N_SERVO_INSTANCES];
static uint32_t n_err_offset_prev[WRS_MAX_N_SERVO_INSTANCES];
static uint32_t n_err_delta_rtt_prev[WRS_MAX_N_SERVO_INSTANCES];
/* store old values of TX and RX PTP counters to calculate delta */
static unsigned long ptp_tx_count_prev[WRS_N_PORTS];
static unsigned long ptp_rx_count_prev[WRS_N_PORTS];
/* store old values of SPLL status */
static int32_t spll_DelCnt_prev;
static void get_wrsPTPStatus(unsigned int ptp_data_nrows);
static void get_wrsSoftPLLStatus();
static void get_wrsSlaveLinksStatus(unsigned int port_status_nrows);
static void get_wrsPTPFramesFlowing(unsigned int port_status_nrows);
time_t wrsTimingStatus_data_fill(void)
{
static time_t time_update; /* time of last update */
static int first_run = 1;
time_t time_ptp_data; /* time when wrsPtpDataTable was updated */
time_t time_spll; /* time when softPLL data was updated */
time_t time_port_status; /* time when port status table was updated */
unsigned int ptp_data_nrows; /* number of rows in wrsPtpDataTable */
unsigned int port_status_nrows; /* number of rows in PortStatusTable */
int i;
struct wrsPtpDataTable_s *pd_a;
struct wrsSpllStatus_s *s;
struct wrsPortStatusTable_s *p_a;
time_ptp_data = wrsPtpDataTable_data_fill(&ptp_data_nrows);
time_spll = wrsSpllStatus_data_fill();
......@@ -65,9 +52,41 @@ time_t wrsTimingStatus_data_fill(void)
/* cache not updated, return last update time */
return time_update;
}
/* update only when ptp_data or spll was updated */
if (time_ptp_data > time_update
|| time_spll > time_update) {
get_wrsPTPStatus(ptp_data_nrows);
}
/* update only when the spll was updated */
if (time_spll > time_update) {
get_wrsSoftPLLStatus();
}
/* update only when the port_status was updated */
if (time_port_status > time_update) {
get_wrsSlaveLinksStatus(port_status_nrows);
get_wrsPTPFramesFlowing(port_status_nrows);
}
time_update = time(NULL);
/* there was an update, return current time */
return time_update;
}
static void get_wrsPTPStatus(unsigned int ptp_data_nrows)
{
struct wrsSpllStatus_s *s;
struct wrsPtpDataTable_s *pd_a;
int i;
static int first_run = 1;
memset(&wrsTimingStatus_s, 0, sizeof(wrsTimingStatus_s));
/* store old values of ptp servo error counters and number of updates */
static uint32_t servo_updates_prev[WRS_MAX_N_SERVO_INSTANCES];
static uint32_t n_err_state_prev[WRS_MAX_N_SERVO_INSTANCES];
static uint32_t n_err_offset_prev[WRS_MAX_N_SERVO_INSTANCES];
static uint32_t n_err_delta_rtt_prev[WRS_MAX_N_SERVO_INSTANCES];
/*********************************************************************\
|*************************** wrsPTPStatus ***************************|
......@@ -112,6 +131,15 @@ time_t wrsTimingStatus_data_fill(void)
n_err_delta_rtt_prev[i] = pd_a[i].n_err_delta_rtt;
}
first_run = 0;
}
static void get_wrsSoftPLLStatus(void)
{
struct wrsSpllStatus_s *s;
/* store old values of SPLL status */
static int32_t spll_DelCnt_prev;
/*********************************************************************\
|************************* wrsSoftPLLStatus *************************|
\*********************************************************************/
......@@ -133,7 +161,15 @@ time_t wrsTimingStatus_data_fill(void)
) {
wrsTimingStatus_s.wrsSoftPLLStatus =
WRS_SOFTPLL_STATUS_ERROR;
/*snmp_log(LOG_ERR, "SNMP: wrsSoftPLLStatus"
"%d %d %d %d\n",
s->wrsSpllSeqState != WRS_SPLL_SEQ_STATE_READY,
s->wrsSpllMode == WRS_SPLL_MODE_GRAND_MASTER && s->wrsSpllAlignState != WRS_SPLL_ALIGN_STATE_LOCKED,
((s->wrsSpllMode != WRS_SPLL_MODE_GRAND_MASTER)
&& (s->wrsSpllMode != WRS_SPLL_MODE_MASTER)
&& (s->wrsSpllMode != WRS_SPLL_MODE_SLAVE)),
((s->wrsSpllMode == WRS_SPLL_MODE_SLAVE) && ((s->wrsSpllHlock == 0) || (s->wrsSpllMlock == 0)))
);*/
} else if ( /* check if warning */
(s->wrsSpllMode == WRS_SPLL_MODE_GRAND_MASTER && s->wrsSpllDelCnt > 0)
|| (s->wrsSpllDelCnt != spll_DelCnt_prev)
......@@ -165,6 +201,12 @@ time_t wrsTimingStatus_data_fill(void)
}
spll_DelCnt_prev = s->wrsSpllDelCnt;
}
static void get_wrsSlaveLinksStatus(unsigned int port_status_nrows)
{
struct wrsPortStatusTable_s *p_a;
int i;
/*********************************************************************\
|************************ wrsSlaveLinksStatus ************************|
......@@ -208,6 +250,17 @@ time_t wrsTimingStatus_data_fill(void)
}
}
}
}
static void get_wrsPTPFramesFlowing(unsigned int port_status_nrows)
{
struct wrsPortStatusTable_s *p_a;
int i;
static int first_run = 1;
/* store old values of TX and RX PTP counters to calculate delta */
static unsigned long ptp_tx_count_prev[WRS_N_PORTS];
static unsigned long ptp_rx_count_prev[WRS_N_PORTS];
/*********************************************************************\
|************************ wrsPTPFramesFlowing ************************|
......@@ -247,8 +300,6 @@ time_t wrsTimingStatus_data_fill(void)
}
first_run = 0;
/* there was an update, return current time */
return time_update;
}
#define GT_OID WRSTIMINGSTATUS_OID
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment