Skip to content
Snippets Groups Projects
Commit 8fa85648 authored by Adam Wujek's avatar Adam Wujek :speech_balloon:
Browse files

merge branch "adam-snmp"


Add verbose messages to the SNMP

Signed-off-by: default avatarAdam Wujek <adam.wujek@cern.ch>
parents f9332f2d 0bf5f4c0
Branches
Tags
No related merge requests found
......@@ -123,8 +123,8 @@ static void get_boot_info(void){
/* get restart reason */
rcsr_map = create_map(ARM_RCSR_ADDR, sizeof(uint32_t));
if (!rcsr_map) {
snmp_log(LOG_ERR, "SNMP: wrsBootStatusGroup unable to map "
"CPU's Reset Controller Status Register\n");
snmp_log(LOG_ERR, "SNMP: " SL_ER " wrsRestartReason: unable to"
" map CPU's Reset Controller Status Register\n");
/* pass error to SNMP, assign 1 */
wrsBootStatus_s.wrsRestartReason = WRS_RESTART_REASON_ERROR;
/* try again next time */
......@@ -138,8 +138,8 @@ static void get_boot_info(void){
f = fopen(BOOTCOUNT_FILE, "r");
if (!f) {
snmp_log(LOG_ERR, "SNMP: wrsBootStatusGroup filed to open "
BOOTCOUNT_FILE"\n");
snmp_log(LOG_ERR, "SNMP: " SL_ER " wrsRestartReason: failed to"
" open " BOOTCOUNT_FILE "\n");
/* notify snmp about error in restart reason */
wrsBootStatus_s.wrsRestartReason = WRS_RESTART_REASON_ERROR;
/* try again next time */
......@@ -215,6 +215,8 @@ static void get_dotconfig_source(void)
* a problem */
wrsBootStatus_s.wrsConfigSource =
WRS_CONFIG_SOURCE_ERROR_MINOR;
snmp_log(LOG_ERR, "SNMP: " SL_ER " wrsConfigSource: failed to "
"open " DOTCONFIGDIR "/" DOTCONFIG_SOURCE "\n");
}
/* read dot-config's URL only when config source is not local */
......@@ -230,6 +232,9 @@ static void get_dotconfig_source(void)
/* host file not found, put "error" into
* wrsConfigSourceHost */
strcpy(wrsBootStatus_s.wrsConfigSourceUrl, "error");
snmp_log(LOG_ERR, "SNMP: " SL_ER " wrsConfigSourceUrl:"
" failed to open "
DOTCONFIGDIR "/" DOTCONFIG_SOURCE_URL"\n");
}
} else {
memset(wrsBootStatus_s.wrsConfigSourceUrl, 0,
......@@ -261,6 +266,8 @@ static void get_dotconfig_source(void)
* a problem */
wrsBootStatus_s.wrsConfigSource =
WRS_CONFIG_STATUS_ERROR_MINOR;
snmp_log(LOG_ERR, "SNMP: " SL_ER " wrsConfigSource: failed to "
"open " DOTCONFIGDIR "/" DOTCONFIG_STATUS"\n");
}
}
......@@ -305,6 +312,8 @@ static void get_boot_scripts_status(void){
* a problem */
wrsBootStatus_s.wrsBootHwinfoReadout =
WRS_BOOT_HWINFO_ERROR_MINOR;
snmp_log(LOG_ERR, "SNMP: " SL_ER " wrsBootHwinfoReadout: "
"failed to open " HWINFO_FILE "\n");
/* try again next time */
run_once = 0;
}
......@@ -324,7 +333,7 @@ static void get_boot_scripts_status(void){
/* try again next time */
run_once = 0;
}
else {/* */
else {/* Failed to load FPGA */
wrsBootStatus_s.wrsBootLoadFPGA =
WRS_BOOT_LOAD_FPGA_ERROR;
/* try again next time */
......@@ -336,6 +345,8 @@ static void get_boot_scripts_status(void){
* a problem */
wrsBootStatus_s.wrsBootLoadFPGA =
WRS_BOOT_LOAD_FPGA_ERROR_MINOR;
snmp_log(LOG_ERR, "SNMP: " SL_ER " wrsBootLoadFPGA: failed to "
"open " LOAD_FPGA_STATUS_FILE "\n");
/* try again next time */
run_once = 0;
}
......@@ -367,6 +378,8 @@ static void get_boot_scripts_status(void){
* a problem */
wrsBootStatus_s.wrsBootLoadLM32 =
WRS_BOOT_LOAD_LM32_ERROR_MINOR;
snmp_log(LOG_ERR, "SNMP: " SL_ER " wrsBootLoadLM32: failed to "
"open " LOAD_FPGA_STATUS_FILE "\n");
/* try again next time */
run_once = 0;
}
......@@ -385,8 +398,8 @@ static void get_loaded_kernel_modules_status(void)
f = fopen(MODULES_FILE, "r");
if (!f) {
snmp_log(LOG_ERR, "SNMP: wrsBootStatusGroup filed to open "
MODULES_FILE"\n");
snmp_log(LOG_ERR, "SNMP: " SL_ER " wrsBootKernelModulesMissing"
": failed to open " MODULES_FILE "\n");
/* notify snmp about error in kernel modules */
wrsBootStatus_s.wrsBootKernelModulesMissing =
ARRAY_SIZE(kernel_modules);
......@@ -441,8 +454,9 @@ static void get_daemons_status(void)
* but probably slower than manually parsing /proc/ */
f = popen(PROCESS_COMMAND, "r");
if (!f) {
snmp_log(LOG_ERR, "SNMP: wrsBootStatusGroup failed to execute "
PROCESS_COMMAND"\n");
snmp_log(LOG_ERR, "SNMP: " SL_ER
" wrsBootUserspaceDaemonsMissing: failed to execute "
PROCESS_COMMAND "\n");
wrsBootStatus_s.wrsBootUserspaceDaemonsMissing = 0;
/* Notify snmp about error in processes list */
/* Count number of expected processes */
......@@ -505,8 +519,8 @@ static void get_n_watchdog_timouts(void)
f = popen(WDOG_COMMAND, "r");
if (!f) {
snmp_log(LOG_ERR, "SNMP: wrsBootStatusGroup failed to execute "
WDOG_COMMAND"\n");
snmp_log(LOG_ERR, "SNMP: " SL_ER " wrsGwWatchdogTimeouts: "
"failed to execute " WDOG_COMMAND "\n");
return;
}
......
......@@ -14,6 +14,12 @@ static struct pickinfo wrsNetworkingStatus_pickinfo[] = {
struct wrsNetworkingStatus_s wrsNetworkingStatus_s;
static struct wrsNetworkingStatus_config ns_dotconfig;
static struct ns_pstats ns_pstats_copy[WRS_N_PORTS];
static char *slog_obj_name;
static char *wrsSFPsStatus_str = "wrsSFPsStatus";
static char *wrsEndpointStatus_str = "wrsEndpointStatus";
static char *wrsSwcoreStatus_str = "wrsSwcoreStatus";
static char *wrsRTUStatus_str = "wrsRTUStatus";
static void copy_pstats(struct ns_pstats *copy, struct wrsPstatsHCTable_s *org,
unsigned int rows)
......@@ -56,25 +62,19 @@ static int get_endpoint_status(struct ns_pstats *old,
int ret;
ret = 0;
slog_obj_name = wrsEndpointStatus_str;
/* values from 2.2.2 "Fault in the Endpoint’s transmission/reception
* path" in wrs_failures document shouldn't change faster than 1
* per second */
for (i = 0; i < rows; i++) {
if (
((new[i].wrsPstatsHCTXUnderrun - old[i].wrsPstatsHCTXUnderrun)/t_delta > 1.0)
|| ((new[i].wrsPstatsHCRXOverrun - old[i].wrsPstatsHCRXOverrun)/t_delta > 1.0)
|| ((new[i].wrsPstatsHCRXInvalidCode - old[i].wrsPstatsHCRXInvalidCode)/t_delta > 1.0)
|| ((new[i].wrsPstatsHCRXSyncLost - old[i].wrsPstatsHCRXSyncLost)/t_delta > 1.0)
|| ((new[i].wrsPstatsHCRXPfilterDropped - old[i].wrsPstatsHCRXPfilterDropped)/t_delta > 1.0)
|| ((new[i].wrsPstatsHCRXPCSErrors - old[i].wrsPstatsHCRXPCSErrors)/t_delta > 1.0)
|| ((new[i].wrsPstatsHCRXCRCErrors - old[i].wrsPstatsHCRXCRCErrors)/t_delta > 1.0)
) {
/* if error, no need to check more, but do it just for
* logs */
ret = 1;
snmp_log(LOG_ERR, "SNMP: wrsEndpointStatus failed for "
"port %d (wri %d)\n", i + 1, i + 1);
}
SLOG_IF_COMP_WNSG(SL_ER, wrsPstatsHCTXUnderrun, new, old, i, t_delta, 1.0, ret = 1);
SLOG_IF_COMP_WNSG(SL_ER, wrsPstatsHCRXOverrun, new, old, i, t_delta, 1.0, ret = 1);
SLOG_IF_COMP_WNSG(SL_ER, wrsPstatsHCRXInvalidCode, new, old, i, t_delta, 1.0, ret = 1);
SLOG_IF_COMP_WNSG(SL_ER, wrsPstatsHCRXSyncLost, new, old, i, t_delta, 1.0, ret = 1);
SLOG_IF_COMP_WNSG(SL_ER, wrsPstatsHCRXPfilterDropped, new, old, i, t_delta, 1.0, ret = 1);
SLOG_IF_COMP_WNSG(SL_ER, wrsPstatsHCRXPCSErrors, new, old, i, t_delta, 1.0, ret = 1);
SLOG_IF_COMP_WNSG(SL_ER, wrsPstatsHCRXCRCErrors, new, old, i, t_delta, 1.0, ret = 1);
}
return ret;
}
......@@ -92,6 +92,8 @@ static int get_swcore_status(struct ns_pstats *old,
/* don't use this function for now, return OK */
return ret;
slog_obj_name = wrsSwcoreStatus_str;
for (i = 0; i < rows; i++) {
/* TXFrames and Forwarded described in 2.2.3 "Problem with the
* SwCore or Endpoint HDL module" in wrs_failures document
......@@ -113,24 +115,16 @@ static int get_swcore_status(struct ns_pstats *old,
/* values from 2.2.5 "Too much HP traffic / Per-priority queue
* full" in wrs_failures document shouldn't change faster
* than parameters defined in dotconfig per second */
if ( /* shouldn't differ more than FORWARD_DELTA */
((new[i].wrsPstatsHCRXFrames - old[i].wrsPstatsHCRXFrames)/t_delta >= ns_dotconfig.rx_frame_rate)
|| ((new[i].wrsPstatsHCRXPrio0 - old[i].wrsPstatsHCRXPrio0)/t_delta >= ns_dotconfig.rx_prio_frame_rate)
|| ((new[i].wrsPstatsHCRXPrio1 - old[i].wrsPstatsHCRXPrio1)/t_delta >= ns_dotconfig.rx_prio_frame_rate)
|| ((new[i].wrsPstatsHCRXPrio2 - old[i].wrsPstatsHCRXPrio2)/t_delta >= ns_dotconfig.rx_prio_frame_rate)
|| ((new[i].wrsPstatsHCRXPrio3 - old[i].wrsPstatsHCRXPrio3)/t_delta >= ns_dotconfig.rx_prio_frame_rate)
|| ((new[i].wrsPstatsHCRXPrio4 - old[i].wrsPstatsHCRXPrio4)/t_delta >= ns_dotconfig.rx_prio_frame_rate)
|| ((new[i].wrsPstatsHCRXPrio5 - old[i].wrsPstatsHCRXPrio5)/t_delta >= ns_dotconfig.rx_prio_frame_rate)
|| ((new[i].wrsPstatsHCRXPrio6 - old[i].wrsPstatsHCRXPrio6)/t_delta >= ns_dotconfig.rx_prio_frame_rate)
|| ((new[i].wrsPstatsHCRXPrio7 - old[i].wrsPstatsHCRXPrio7)/t_delta >= ns_dotconfig.rx_prio_frame_rate)
|| ((new[i].wrsPstatsHCFastMatchPriority - old[i].wrsPstatsHCFastMatchPriority)/t_delta >= ns_dotconfig.hp_frame_rate)
) {
/* if error, no need to check more, but do it just for
* logs */
ret = 1;
snmp_log(LOG_ERR, "SNMP: wrsSwcoreStatus failed for "
"port %d (wri %d)\n", i + 1, i + 1);
}
SLOG_IF_COMP_WNSG(SL_ER, wrsPstatsHCRXFrames, new, old, i, t_delta, ns_dotconfig.rx_frame_rate, ret = 1);
SLOG_IF_COMP_WNSG(SL_ER, wrsPstatsHCRXPrio0, new, old, i, t_delta, ns_dotconfig.rx_prio_frame_rate, ret = 1);
SLOG_IF_COMP_WNSG(SL_ER, wrsPstatsHCRXPrio1, new, old, i, t_delta, ns_dotconfig.rx_prio_frame_rate, ret = 1);
SLOG_IF_COMP_WNSG(SL_ER, wrsPstatsHCRXPrio2, new, old, i, t_delta, ns_dotconfig.rx_prio_frame_rate, ret = 1);
SLOG_IF_COMP_WNSG(SL_ER, wrsPstatsHCRXPrio3, new, old, i, t_delta, ns_dotconfig.rx_prio_frame_rate, ret = 1);
SLOG_IF_COMP_WNSG(SL_ER, wrsPstatsHCRXPrio4, new, old, i, t_delta, ns_dotconfig.rx_prio_frame_rate, ret = 1);
SLOG_IF_COMP_WNSG(SL_ER, wrsPstatsHCRXPrio5, new, old, i, t_delta, ns_dotconfig.rx_prio_frame_rate, ret = 1);
SLOG_IF_COMP_WNSG(SL_ER, wrsPstatsHCRXPrio6, new, old, i, t_delta, ns_dotconfig.rx_prio_frame_rate, ret = 1);
SLOG_IF_COMP_WNSG(SL_ER, wrsPstatsHCRXPrio7, new, old, i, t_delta, ns_dotconfig.rx_prio_frame_rate, ret = 1);
SLOG_IF_COMP_WNSG(SL_ER, wrsPstatsHCFastMatchPriority, new, old, i, t_delta, ns_dotconfig.hp_frame_rate, ret = 1);
}
return ret;
}
......@@ -143,6 +137,8 @@ static int get_rtu_status(struct ns_pstats *old,
int ret;
ret = 0;
slog_obj_name = wrsRTUStatus_str;
/* values from 2.2.4 "RTU is full and cannot accept more requests" in
* wrs_failures document shouldn't increase */
for (i = 0; i < rows; i++) {
......@@ -150,8 +146,13 @@ static int get_rtu_status(struct ns_pstats *old,
/* if error, no need to check more, but do it just for
* logs */
ret = 1;
snmp_log(LOG_ERR, "SNMP: wrsEndpointStatus failed for "
"port %d (wri %d)\n", i + 1, i + 1);
snmp_log(LOG_ERR, "SNMP: " SL_ER " %s: "
"wrsPstatsHCRXDropRTUFull counter for port %i (wri %i) increased by %lld, allowed %d\n",
slog_obj_name, i + 1, i + 1,
new[i].wrsPstatsHCRXDropRTUFull - old[i].wrsPstatsHCRXDropRTUFull, 0);
snmp_log(LOG_ERR, "SNMP: " SL_ER " %s: "
"some frames were lost because RTU could not accept new requests\n",
slog_obj_name);
}
}
/* TODO: add 2.2.7 "Network loop - two or more identical MACs on two or
......@@ -182,7 +183,7 @@ time_t wrsNetworkingStatus_data_fill(void)
static time_t time_update; /* time of last update */
time_t time_port_status; /* time when port status table was updated */
time_t time_pstats; /* time when pstats table was updated */
float time_pstats_delta; /* seconds since last update */
time_t time_pstats_delta; /* seconds since last update */
static time_t time_pstats_prev; /* time when previous state of pstats
* table was updated */
unsigned int port_status_nrows; /* number of rows in PortStatusTable */
......@@ -204,7 +205,6 @@ time_t wrsNetworkingStatus_data_fill(void)
/* cache not updated, return last update time */
return time_update;
}
time_update = get_monotonic_sec();
if (run_once) {
run_once = 0;
......@@ -212,59 +212,71 @@ time_t wrsNetworkingStatus_data_fill(void)
load_dot_config();
}
time_pstats_delta = time_pstats - time_pstats_prev;
memset(&wrsNetworkingStatus_s, 0, sizeof(wrsNetworkingStatus_s));
/*********************************************************************\
|*************************** wrsSFPsStatus ***************************|
\*********************************************************************/
slog_obj_name = wrsSFPsStatus_str;
p_a = wrsPortStatusTable_array;
port_status_n_ok = 0;
port_status_n_error = 0;
port_status_n_down = 0;
port_status_n_na = 0;
/* count number of ports of each status */
for (i = 0; i < port_status_nrows; i++) {
if (p_a[i].wrsPortStatusSfpError == WRS_PORT_STATUS_SFP_ERROR_SFP_OK) {
port_status_n_ok++;
}
if (p_a[i].wrsPortStatusSfpError == WRS_PORT_STATUS_SFP_ERROR_SFP_ERROR) {
port_status_n_error++;
if (time_port_status > time_update) {
/* update only if wrsPortStatusTable was updated */
port_status_n_ok = 0;
port_status_n_error = 0;
port_status_n_down = 0;
port_status_n_na = 0;
/* count number of ports of each status */
for (i = 0; i < port_status_nrows; i++) {
if (p_a[i].wrsPortStatusSfpError == WRS_PORT_STATUS_SFP_ERROR_SFP_OK) {
port_status_n_ok++;
}
if (p_a[i].wrsPortStatusSfpError == WRS_PORT_STATUS_SFP_ERROR_PORT_DOWN) {
port_status_n_down++;
}
if (p_a[i].wrsPortStatusSfpError == WRS_PORT_STATUS_SFP_ERROR_SFP_ERROR) {
port_status_n_error++;
}
if (p_a[i].wrsPortStatusSfpError == 0) {
snmp_log(LOG_ERR, "SNMP: " SL_NA " %s: Unable to read wrsSFPsStatus "
"for port %i (wri%i)\n",
slog_obj_name, i + 1, i + 1);
port_status_n_na++;
}
}
if (p_a[i].wrsPortStatusSfpError == WRS_PORT_STATUS_SFP_ERROR_PORT_DOWN) {
port_status_n_down++;
}
if (p_a[i].wrsPortStatusSfpError == 0) {
port_status_n_na++;
}
}
if ((port_status_n_error > 0)
|| ((port_status_n_ok + port_status_n_down + port_status_n_na)
!= port_status_nrows)
) {
/* error */
wrsNetworkingStatus_s.wrsSFPsStatus = WRS_SFPS_STATUS_ERROR;
} else if (port_status_n_na > 0) { /* warning NA */
wrsNetworkingStatus_s.wrsSFPsStatus =
WRS_SFPS_STATUS_WARNING_NA;
} else if ((port_status_n_ok + port_status_n_down) ==
port_status_nrows) {
/* OK is when port is ok or down */
wrsNetworkingStatus_s.wrsSFPsStatus = WRS_SFPS_STATUS_OK;
} else { /* probably bug in previous conditions,
* this should never happen */
wrsNetworkingStatus_s.wrsSFPsStatus = WRS_SFPS_STATUS_BUG;
if (port_status_n_error > 0) {
/* error */
wrsNetworkingStatus_s.wrsSFPsStatus = WRS_SFPS_STATUS_ERROR;
} else if ((port_status_n_ok + port_status_n_down + port_status_n_na)
!= port_status_nrows) {
snmp_log(LOG_ERR, "SNMP: " SL_ER " %s: Error reading statuses of SFPs\n",
slog_obj_name);
wrsNetworkingStatus_s.wrsSFPsStatus = WRS_SFPS_STATUS_ERROR;
} else if (port_status_n_na > 0) { /* warning NA */
wrsNetworkingStatus_s.wrsSFPsStatus =
WRS_SFPS_STATUS_WARNING_NA;
} else if ((port_status_n_ok + port_status_n_down) ==
port_status_nrows) {
/* OK is when port is ok or down */
wrsNetworkingStatus_s.wrsSFPsStatus = WRS_SFPS_STATUS_OK;
} else { /* probably bug in previous conditions,
* this should never happen */
wrsNetworkingStatus_s.wrsSFPsStatus = WRS_SFPS_STATUS_BUG;
}
}
/*********************************************************************\
|************************* wrsEndpointStatus *************************|
\*********************************************************************/
if (time_pstats_prev) { /* never generate error during first check */
if (!time_pstats_delta) {
/* do nothing when time_pstats_delta == 0, it means there was
* no re-read of pstats */
} else if (time_pstats_prev && time_pstats_delta) { /* never generate error during first check */
ret = get_endpoint_status(ns_pstats_copy, pstats_array,
pstats_nrows, time_pstats_delta);
if (ret == 0)
......@@ -283,7 +295,10 @@ time_t wrsNetworkingStatus_data_fill(void)
|************************** wrsSwcoreStatus **************************|
\*********************************************************************/
if (time_pstats_prev) { /* never generate error during first check */
if (!time_pstats_delta) {
/* do nothing when time_pstats_delta == 0, it means there was
* no re-read of pstats */
} else if (time_pstats_prev && time_pstats_delta) { /* never generate error during first check */
ret = get_swcore_status(ns_pstats_copy, pstats_array,
pstats_nrows, time_pstats_delta);
if (ret == 0)
......@@ -301,21 +316,26 @@ time_t wrsNetworkingStatus_data_fill(void)
|*************************** wrsRTUStatus ***************************|
\*********************************************************************/
if (time_pstats_prev) { /* never generate error during first check */
if (!time_pstats_delta) {
/* do nothing when time_pstats_delta == 0, it means there was
* no re-read of pstats */
} else if (time_pstats_prev) { /* never generate error during first check */
ret = get_rtu_status(ns_pstats_copy, pstats_array,
pstats_nrows, time_pstats_delta);
pstats_nrows, time_pstats_delta);
if (ret == 0)
wrsNetworkingStatus_s.wrsRTUStatus =
WRS_RTU_STATUS_OK;
else
wrsNetworkingStatus_s.wrsRTUStatus =
WRS_RTU_STATUS_ERROR;
} else {
/* first read */
wrsNetworkingStatus_s.wrsRTUStatus = WRS_RTU_STATUS_FR;
}
time_update = get_monotonic_sec();
/* save time of pstats copy */
time_pstats_prev = time_pstats;
/* copy current set of pstats */
......
......@@ -63,9 +63,9 @@ struct ns_pstats {
/* parameters read from dot-config */
struct wrsNetworkingStatus_config {
int hp_frame_rate;
int rx_frame_rate;
int rx_prio_frame_rate;
float hp_frame_rate;
float rx_frame_rate;
float rx_prio_frame_rate;
};
#endif /* WRS_NETWORKING_STATUS_GROUP_H */
This diff is collapsed.
......@@ -5,6 +5,9 @@
/* Our data: per-port information */
struct wrsPortStatusTable_s wrsPortStatusTable_array[WRS_N_PORTS];
static char *slog_obj_name;
static char *wrsPortStatusSfpError_str = "wrsPortStatusSfpError";
static struct pickinfo wrsPortStatusTable_pickinfo[] = {
FIELD(wrsPortStatusTable_s, ASN_UNSIGNED, index), /* not reported */
FIELD(wrsPortStatusTable_s, ASN_OCTET_STR, wrsPortStatusPortName),
......@@ -50,7 +53,7 @@ time_t wrsPortStatusTable_data_fill(unsigned int *n_rows)
/* check whether shmem is available */
if (!shmem_ready_hald()) {
/* there was an update, return current time */
snmp_log(LOG_ERR, "%s: Unable to read HAL's shmem\n", __func__);
snmp_log(LOG_ERR, "%s: Unable to read HAL shmem\n", __func__);
n_rows_local = 0;
return time_cur;
} else {
......@@ -101,10 +104,20 @@ time_t wrsPortStatusTable_data_fill(unsigned int *n_rows)
/* FIXME: get real peer_id */
memset(&wrsPortStatusTable_array[i].wrsPortStatusPeer, 0xff,
sizeof(ClockIdentity));
wrsPortStatusTable_array[i].wrsPortStatusSfpInDB =
port_state->calib.sfp.flags & SFP_FLAG_IN_DB ? 2 : 1;
wrsPortStatusTable_array[i].wrsPortStatusSfpGbE =
port_state->calib.sfp.flags & SFP_FLAG_1GbE ? 2 : 1;
if (port_state->calib.sfp.flags & SFP_FLAG_IN_DB) {
wrsPortStatusTable_array[i].wrsPortStatusSfpInDB =
WRS_PORT_STATUS_SFP_IN_DB_IN_DATA_BASE;
} else {
wrsPortStatusTable_array[i].wrsPortStatusSfpInDB =
WRS_PORT_STATUS_SFP_IN_DB_NOT_IN_DATA_BASE;
}
if (port_state->calib.sfp.flags & SFP_FLAG_1GbE) {
wrsPortStatusTable_array[i].wrsPortStatusSfpGbE =
WRS_PORT_STATUS_SFP_GBE_LINK_GBE;
} else {
wrsPortStatusTable_array[i].wrsPortStatusSfpGbE =
WRS_PORT_STATUS_SFP_GBE_LINK_NOT_GBE;
}
strncpy(wrsPortStatusTable_array[i].wrsPortStatusSfpVN,
port_state->calib.sfp.vendor_name,
sizeof(wrsPortStatusTable_array[i].wrsPortStatusSfpVN));
......@@ -115,16 +128,26 @@ time_t wrsPortStatusTable_data_fill(unsigned int *n_rows)
port_state->calib.sfp.vendor_serial,
sizeof(wrsPortStatusTable_array[i].wrsPortStatusSfpVS));
/* sfp error when SFP is not 1 GbE or
* (port is not wr-non mode and sfp not in data base)
* Keep value 0 for Not available
* sfp ok is 1 (WRS_PORT_STATUS_SFP_ERROR_SFP_OK)
* sfp error is 2 WRS_PORT_STATUS_SFP_ERROR_SFP_ERROR
* port down, set above, is 3
* (port is not non-wr mode and sfp not in data base)
* port down, is set above
* (WRS_PORT_STATUS_SFP_ERROR_PORT_DOWN) */
wrsPortStatusTable_array[i].wrsPortStatusSfpError = 1 +
((wrsPortStatusTable_array[i].wrsPortStatusSfpGbE == 1) ||
((port_state->mode != HEXP_PORT_MODE_NON_WR) &&
(wrsPortStatusTable_array[i].wrsPortStatusSfpInDB == 1)));
slog_obj_name = wrsPortStatusSfpError_str;
wrsPortStatusTable_array[i].wrsPortStatusSfpError = WRS_PORT_STATUS_SFP_ERROR_SFP_OK;
if (wrsPortStatusTable_array[i].wrsPortStatusSfpGbE == WRS_PORT_STATUS_SFP_GBE_LINK_NOT_GBE) {
/* error, SFP is not 1 GbE */
wrsPortStatusTable_array[i].wrsPortStatusSfpError = WRS_PORT_STATUS_SFP_ERROR_SFP_ERROR;
snmp_log(LOG_ERR, "SNMP: " SL_ER " %s: "
"SFP in port %d (wri%d) is not for Gigabit Ethernet\n",
slog_obj_name, i + 1, i + 1);
}
if ((wrsPortStatusTable_array[i].wrsPortStatusConfiguredMode != WRS_PORT_STATUS_CONFIGURED_MODE_NON_WR) &&
(wrsPortStatusTable_array[i].wrsPortStatusSfpInDB == WRS_PORT_STATUS_SFP_IN_DB_NOT_IN_DATA_BASE)) {
/* error, port is not non-wr mode and sfp not in data base */
wrsPortStatusTable_array[i].wrsPortStatusSfpError = WRS_PORT_STATUS_SFP_ERROR_SFP_ERROR;
snmp_log(LOG_ERR, "SNMP: " SL_ER " %s: "
"SFP in port %d (wri%d) is not in database. Change the SFP or declare port as non-wr\n",
slog_obj_name, i + 1, i + 1);
}
snmp_log(LOG_DEBUG, "reading ports name %s link %d, "
"mode %d, locked %d\n", port_state->name,
......@@ -135,7 +158,7 @@ time_t wrsPortStatusTable_data_fill(unsigned int *n_rows)
retries++;
if (retries > 100) {
snmp_log(LOG_ERR, "%s: too many retries to read HAL\n",
snmp_log(LOG_ERR, "%s: Unable to read HAL, too many retries\n",
__func__);
retries = 0;
}
......@@ -148,7 +171,7 @@ time_t wrsPortStatusTable_data_fill(unsigned int *n_rows)
/* check whether shmem is available */
if (!shmem_ready_ppsi()) {
/* there was an update, return current time */
snmp_log(LOG_ERR, "%s: Unable to read PPSI's shmem\n",
snmp_log(LOG_ERR, "%s: Unable to read PPSI shmem\n",
__func__);
return time_cur;
}
......@@ -185,8 +208,8 @@ time_t wrsPortStatusTable_data_fill(unsigned int *n_rows)
}
retries++;
if (retries > 100) {
snmp_log(LOG_ERR, "%s: too many retries to read PPSI "
"shmem\n", __func__);
snmp_log(LOG_ERR, "%s: Unable to read PPSI, too many retries\n",
__func__);
retries = 0;
break;
}
......
......@@ -16,6 +16,11 @@
#define WRS_PORT_STATUS_CONFIGURED_MODE_NON_WR 3
#define WRS_PORT_STATUS_CONFIGURED_MODE_AUTO 4
#define WRS_PORT_STATUS_SFP_IN_DB_NOT_IN_DATA_BASE 1 /* error */
#define WRS_PORT_STATUS_SFP_IN_DB_IN_DATA_BASE 2 /* ok */
#define WRS_PORT_STATUS_SFP_GBE_LINK_NOT_GBE 1 /* error */
#define WRS_PORT_STATUS_SFP_GBE_LINK_GBE 2 /* ok */
struct wrsPortStatusTable_s {
uint32_t index; /* not reported, index fields has to be marked
......
......@@ -52,4 +52,60 @@ struct pickinfo {
.len = sizeof(((struct _struct *)0)->_field), \
}
/*
* Print a message and execute assignment when the value of _object grows
* faster than _rate.
* Special version for wrsNetworkingStatusGroup.
*
* usage:
* _log_type -- on of the SL_* string defines
* _obj -- object to be checked in the arrays
* _new -- array with the new values
* _old -- array with the old values
* _i -- port number
* _t_delta -- time since last read, used to calculate rate
* _rate -- maximum allowed rate
*
* _assign -- assignment to be performed when condition is met
* NOTE:
*
* Valid example:
* strcpy(slog_obj_name, "my_obj");
* SLOG_IF_COMP_WNSG(SL_ER, a, new, old, 1, t_delta, 1.0, ret = 1);
* When condition (new.a[i] - old.a[i])/t_delta > 1.0 is met, macro will assign 1 to ret and print
* the following message:
* SNMP: Error my_obj: a for port 1 (wri1) increased by 10.0, allowed 1.0
*/
/* WNSG = WrsNetworkingStatusGroup */
#define SLOG_IF_COMP_WNSG(_log_type, _obj, _new, _old, _i, _t_delta, _rate, _assign) \
do { if ((_new[_i]._obj - _old[_i]._obj)/_t_delta > _rate) {\
_assign; \
snmp_log(LOG_ERR, "SNMP: " _log_type " %s: " #_obj " for port %i (wri%i) increased by more than %.0f during %.0fs, allowed %.0f\n", \
slog_obj_name, _i + 1, _i + 1, \
(_new[_i]._obj - _old[_i]._obj)/_t_delta, _t_delta, \
_rate); \
} \
} while (0)
/*
* Print a message about an object
*
* Valid example2:
* strcpy(slog_obj_name, "my_obj");
* SLOG(SL_BUG);
* prints:
* SNMP: BUG my_obj
*/
#define SLOG(_log_type) \
do { \
snmp_log(LOG_ERR, "SNMP: " _log_type " %s\n", slog_obj_name); \
} while (0)
/* String definitions for functions SLOG* */
#define SL_ER "Error"
#define SL_W "Warning"
#define SL_NA "Warning NA"
#define SL_BUG "BUG"
#endif /* WRS_SNMP_H */
......@@ -13,8 +13,13 @@ static struct pickinfo wrsTimingStatus_pickinfo[] = {
};
struct wrsTimingStatus_s wrsTimingStatus_s;
static char *slog_obj_name;
static char *wrsPTPStatus_str = "wrsPTPStatus";
static char *wrsSoftPLLStatus_str = "wrsSoftPLLStatus";
static char *wrsSlaveLinksStatus_str = "wrsSlaveLinksStatus";
static char *wrsPTPFramesFlowing_str = "wrsPTPFramesFlowing";
static void get_wrsPTPStatus(unsigned int ptp_data_nrows);
static void get_wrsPTPStatus(unsigned int ptp_data_nrows, int t_delta);
static void get_wrsSoftPLLStatus();
static void get_wrsSlaveLinksStatus(unsigned int port_status_nrows);
static void get_wrsPTPFramesFlowing(unsigned int port_status_nrows);
......@@ -25,6 +30,8 @@ time_t wrsTimingStatus_data_fill(void)
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 */
static time_t time_ptp_data_prev; /* time when previous wrsPtpDataTable
* table was updated */
unsigned int ptp_data_nrows; /* number of rows in wrsPtpDataTable */
unsigned int port_status_nrows; /* number of rows in PortStatusTable */
......@@ -57,7 +64,8 @@ time_t wrsTimingStatus_data_fill(void)
* otherwise there may be comparison between the same data */
if (time_ptp_data > time_update
&& time_spll > time_update) {
get_wrsPTPStatus(ptp_data_nrows);
get_wrsPTPStatus(ptp_data_nrows,
time_ptp_data - time_ptp_data_prev);
}
/* update when the spll was updated
......@@ -74,14 +82,17 @@ time_t wrsTimingStatus_data_fill(void)
}
time_update = get_monotonic_sec();
/* save the time of the last ptp_data copy */
time_ptp_data_prev = time_ptp_data;
/* there was an update, return current time */
return time_update;
}
static void get_wrsPTPStatus(unsigned int ptp_data_nrows)
static void get_wrsPTPStatus(unsigned int ptp_data_nrows, int t_delta)
{
struct wrsSpllStatus_s *s;
struct wrsPtpDataTable_s *pd_a;
struct wrsTimingStatus_s *t;
int i;
static int first_run = 1;
......@@ -100,33 +111,75 @@ static void get_wrsPTPStatus(unsigned int ptp_data_nrows)
*/
s = &wrsSpllStatus_s;
pd_a = wrsPtpDataTable_array;
t = &wrsTimingStatus_s;
slog_obj_name = wrsPTPStatus_str;
wrsTimingStatus_s.wrsPTPStatus = WRS_PTP_STATUS_OK;
t->wrsPTPStatus = WRS_PTP_STATUS_OK;
/* NOTE: only one PTP instance is used right now. When switchover is
* implemented it will change */
for (i = 0; i < ptp_data_nrows; i++) {
if (first_run == 1) {
/* don't report errors during first run */
wrsTimingStatus_s.wrsPTPStatus = WRS_PTP_STATUS_FR;
t->wrsPTPStatus = WRS_PTP_STATUS_FR;
/* no need to check others */
break;
/* check if error */
} else if ((s->wrsSpllMode == WRS_SPLL_MODE_SLAVE)
&& ((pd_a[i].wrsPtpServoUpdates == wrsPtpServoUpdates_prev[i])
|| (pd_a[i].wrsPtpServoStateErrCnt != wrsPtpServoStateErrCnt_prev[i])
|| (pd_a[i].wrsPtpClockOffsetErrCnt != wrsPtpClockOffsetErrCnt_prev[i])
|| (pd_a[i].wrsPtpRTTErrCnt != wrsPtpRTTErrCnt_prev[i])
|| (pd_a[i].wrsPtpDeltaTxM == 0)
|| (pd_a[i].wrsPtpDeltaRxM == 0)
|| (pd_a[i].wrsPtpDeltaTxS == 0)
|| (pd_a[i].wrsPtpDeltaRxS == 0))) {
wrsTimingStatus_s.wrsPTPStatus = WRS_PTP_STATUS_ERROR;
snmp_log(LOG_ERR, "SNMP: wrsPTPStatus "
"failed for instance %d\n", i);
/* no more can be done, error is error
* update prev values outside loop */
break;
} else if (s->wrsSpllMode == WRS_SPLL_MODE_SLAVE) {
if (pd_a[i].wrsPtpServoUpdates == wrsPtpServoUpdates_prev[i]) {
t->wrsPTPStatus = WRS_PTP_STATUS_ERROR;
snmp_log(LOG_ERR, "SNMP: " SL_ER " %s: "
"No PTP servo update since last check (%ds)\n",
slog_obj_name, t_delta);
}
if (pd_a[i].wrsPtpServoStateErrCnt != wrsPtpServoStateErrCnt_prev[i]) {
t->wrsPTPStatus = WRS_PTP_STATUS_ERROR;
snmp_log(LOG_ERR, "SNMP: " SL_ER " %s: "
"PTP servo not in TRACK_PHASE - %d times since last check (%ds)\n",
slog_obj_name,
pd_a[i].wrsPtpServoStateErrCnt - wrsPtpServoStateErrCnt_prev[i],
t_delta);
}
if (pd_a[i].wrsPtpClockOffsetErrCnt != wrsPtpClockOffsetErrCnt_prev[i]) {
t->wrsPTPStatus = WRS_PTP_STATUS_ERROR;
snmp_log(LOG_ERR, "SNMP: " SL_ER " %s: "
"PTP clock offset too large - %d times since last check (%ds)\n",
slog_obj_name,
pd_a[i].wrsPtpClockOffsetErrCnt - wrsPtpClockOffsetErrCnt_prev[i],
t_delta);
}
if (pd_a[i].wrsPtpRTTErrCnt != wrsPtpRTTErrCnt_prev[i]) {
t->wrsPTPStatus = WRS_PTP_STATUS_ERROR;
snmp_log(LOG_ERR, "SNMP: " SL_ER " %s: "
"Jump in RTT value - %d times since last check (%ds)\n",
slog_obj_name,
pd_a[i].wrsPtpRTTErrCnt - wrsPtpRTTErrCnt_prev[i],
t_delta);
}
if (pd_a[i].wrsPtpDeltaTxM == 0) {
t->wrsPTPStatus = WRS_PTP_STATUS_ERROR;
snmp_log(LOG_ERR, "SNMP: " SL_ER " %s: "
"DeltaTx for Master set to 0\n",
slog_obj_name);
}
if (pd_a[i].wrsPtpDeltaRxM == 0) {
t->wrsPTPStatus = WRS_PTP_STATUS_ERROR;
snmp_log(LOG_ERR, "SNMP: " SL_ER " %s: "
"DeltaRx for Master set to 0\n",
slog_obj_name);
}
if (pd_a[i].wrsPtpDeltaTxS == 0) {
t->wrsPTPStatus = WRS_PTP_STATUS_ERROR;
snmp_log(LOG_ERR, "SNMP: " SL_ER " %s: "
"DeltaTx for Slave set to 0\n",
slog_obj_name);
}
if (pd_a[i].wrsPtpDeltaRxS == 0) {
t->wrsPTPStatus = WRS_PTP_STATUS_ERROR;
snmp_log(LOG_ERR, "SNMP: " SL_ER " %s: "
"DeltaRx for Slave set to 0\n",
slog_obj_name);
}
}
}
......@@ -144,6 +197,7 @@ static void get_wrsPTPStatus(unsigned int ptp_data_nrows)
static void get_wrsSoftPLLStatus(void)
{
struct wrsSpllStatus_s *s;
struct wrsTimingStatus_s *t;
/* store old values of SPLL status */
static int32_t spll_DelCnt_prev;
......@@ -158,53 +212,98 @@ static void get_wrsSoftPLLStatus(void)
* mode = 3 (slave) and wrsSpllHlock != 0 and wrsSpllMlock != 0
*/
s = &wrsSpllStatus_s;
if ( /* check if error */
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)
t = &wrsTimingStatus_s;
slog_obj_name = wrsSoftPLLStatus_str;
t->wrsSoftPLLStatus = 0;
/* check if error */
if (s->wrsSpllSeqState != WRS_SPLL_SEQ_STATE_READY) {
t->wrsSoftPLLStatus = WRS_SOFTPLL_STATUS_ERROR;
snmp_log(LOG_ERR, "SNMP: " SL_ER " %s: "
"Sequencing FSM state of SoftPLL is not READY. "
"SoftPLL is not yet ready or has unlocked.\n",
slog_obj_name);
}
if (s->wrsSpllMode == WRS_SPLL_MODE_GRAND_MASTER
&& s->wrsSpllAlignState != WRS_SPLL_ALIGN_STATE_LOCKED) {
t->wrsSoftPLLStatus = WRS_SOFTPLL_STATUS_ERROR;
snmp_log(LOG_ERR, "SNMP: " SL_ER " %s: "
"Allignment FSM state of SoftPLL is not LOCKED. "
"SoftPLL is not yet ready or has unlocked.\n",
slog_obj_name);
}
if ((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)))
) {
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)
) { /* warning */
wrsTimingStatus_s.wrsSoftPLLStatus =
WRS_SOFTPLL_STATUS_WARNING;
} else if ( /* check if any of fields equal to 0 or WARNING_NA */
s->wrsSpllMode == 0
) { /* warning NA */
wrsTimingStatus_s.wrsSoftPLLStatus =
WRS_SOFTPLL_STATUS_WARNING_NA;
} else if ( /* check if OK */
&& (s->wrsSpllMode != WRS_SPLL_MODE_SLAVE)) {
t->wrsSoftPLLStatus = WRS_SOFTPLL_STATUS_ERROR;
snmp_log(LOG_ERR, "SNMP: " SL_ER " %s: "
"SoftPLL in mode %d which is neither of the supported "
"modes: GrandMaster, Master, Slave\n",
slog_obj_name, s->wrsSpllMode);
}
if ((s->wrsSpllMode == WRS_SPLL_MODE_SLAVE) && (s->wrsSpllHlock == 0)){
t->wrsSoftPLLStatus = WRS_SOFTPLL_STATUS_ERROR;
snmp_log(LOG_ERR, "SNMP: " SL_ER " %s: "
"SoftPLL is in Slave mode and Helper PLL is not locked\n",
slog_obj_name);
}
if ((s->wrsSpllMode == WRS_SPLL_MODE_SLAVE) && (s->wrsSpllMlock == 0)){
t->wrsSoftPLLStatus = WRS_SOFTPLL_STATUS_ERROR;
snmp_log(LOG_ERR, "SNMP: " SL_ER " %s: "
"SoftPLL is in Slave mode and Main PLL is not locked\n",
slog_obj_name);
}
/* check if warning */
if (!t->wrsSoftPLLStatus) {
if (s->wrsSpllMode == WRS_SPLL_MODE_GRAND_MASTER && s->wrsSpllDelCnt > 0) {
t->wrsSoftPLLStatus = WRS_SOFTPLL_STATUS_WARNING;
snmp_log(LOG_ERR, "SNMP: " SL_W " %s: "
"SoftPLL in GrandMaster mode has unlocked from "
"the external reference. Delock counter is %d\n",
slog_obj_name, s->wrsSpllDelCnt);
}
if (s->wrsSpllMode == WRS_SPLL_MODE_MASTER && s->wrsSpllDelCnt != spll_DelCnt_prev) {
t->wrsSoftPLLStatus = WRS_SOFTPLL_STATUS_WARNING;
snmp_log(LOG_ERR, "SNMP: " SL_W " %s: "
"SoftPLL in Master mode has unlocked. Delock "
"counter insceased by %d\n",
slog_obj_name,
s->wrsSpllDelCnt - spll_DelCnt_prev);
}
if (s->wrsSpllMode == WRS_SPLL_MODE_SLAVE && s->wrsSpllDelCnt != spll_DelCnt_prev) {
t->wrsSoftPLLStatus = WRS_SOFTPLL_STATUS_WARNING;
snmp_log(LOG_ERR, "SNMP: " SL_W " %s: "
"SoftPLL in Slave mode has unlocked. Delock "
"counter insceased by %d\n",
slog_obj_name,
s->wrsSpllDelCnt - spll_DelCnt_prev);
}
}
/* check if any of fields equal to 0 or WARNING_NA */
if (!t->wrsSoftPLLStatus) {
if (s->wrsSpllMode == 0) {
t->wrsSoftPLLStatus = WRS_SOFTPLL_STATUS_WARNING_NA;
snmp_log(LOG_ERR, "SNMP: " SL_NA " %s: "
"SoftPLL mode not set\n",
slog_obj_name);
}
}
/* check if OK */
if ((!t->wrsSoftPLLStatus) && (
((s->wrsSpllMode == WRS_SPLL_MODE_GRAND_MASTER && s->wrsSpllDelCnt == 0)
|| (s->wrsSpllDelCnt == spll_DelCnt_prev))
&& 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_MASTER)
|| (s->wrsSpllMode == WRS_SPLL_MODE_SLAVE))
|| (s->wrsSpllMode == WRS_SPLL_MODE_SLAVE)))
) { /* OK */
wrsTimingStatus_s.wrsSoftPLLStatus =
WRS_SOFTPLL_STATUS_OK;
} else { /* probably bug in previous conditions,
* this should never happen */
wrsTimingStatus_s.wrsSoftPLLStatus =
WRS_SOFTPLL_STATUS_BUG;
t->wrsSoftPLLStatus = WRS_SOFTPLL_STATUS_OK;
}
/* probably bug in previous conditions, this should never happen */
if (!t->wrsSoftPLLStatus) {
t->wrsSoftPLLStatus = WRS_SOFTPLL_STATUS_BUG;
SLOG(SL_BUG);
}
spll_DelCnt_prev = s->wrsSpllDelCnt;
......@@ -213,6 +312,7 @@ static void get_wrsSoftPLLStatus(void)
static void get_wrsSlaveLinksStatus(unsigned int port_status_nrows)
{
struct wrsPortStatusTable_s *p_a;
struct wrsTimingStatus_s *t;
int i;
/*********************************************************************\
......@@ -224,38 +324,67 @@ static void get_wrsSlaveLinksStatus(unsigned int port_status_nrows)
* mode. Don't care about non-wr and auto ports.
*/
p_a = wrsPortStatusTable_array;
t = &wrsTimingStatus_s;
slog_obj_name = wrsSlaveLinksStatus_str;
/* check whether hal_shmem is available */
if (shmem_ready_hald()) {
wrsTimingStatus_s.wrsSlaveLinksStatus = WRS_SLAVE_LINK_STATUS_OK;
t->wrsSlaveLinksStatus = WRS_SLAVE_LINK_STATUS_OK;
for (i = 0; i < port_status_nrows; i++) {
/* warning N/A */
if (/*hal_shmem->s->wrsSpllMode == 0
|| */p_a[i].wrsPortStatusConfiguredMode == 0
|| p_a[i].wrsPortStatusLink == 0){
wrsTimingStatus_s.wrsSlaveLinksStatus =
WRS_SLAVE_LINK_STATUS_WARNING_NA;
if (p_a[i].wrsPortStatusConfiguredMode == 0) {
if (t->wrsSlaveLinksStatus != WRS_SLAVE_LINK_STATUS_ERROR) {
t->wrsSlaveLinksStatus = WRS_SLAVE_LINK_STATUS_WARNING_NA;
}
/* Log always for every port */
snmp_log(LOG_ERR, "SNMP: " SL_NA " %s: "
"Status of wrsPortStatusConfiguredMode not available "
"for port %i (wri%i)\n",
slog_obj_name, i + 1, i + 1);
}
if (p_a[i].wrsPortStatusLink == 0){
if (t->wrsSlaveLinksStatus != WRS_SLAVE_LINK_STATUS_ERROR) {
t->wrsSlaveLinksStatus = WRS_SLAVE_LINK_STATUS_WARNING_NA;
}
/* Log always for every port */
snmp_log(LOG_ERR, "SNMP: " SL_NA " %s: "
"Status of wrsPortStatusLink not available "
"for port %i (wri%i)\n",
slog_obj_name, i + 1, i + 1);
}
/* error when slave port is down when switch is in slave mode
*/
if (hal_shmem->hal_mode == HAL_TIMING_MODE_BC
&& (p_a[i].wrsPortStatusConfiguredMode == WRS_PORT_STATUS_CONFIGURED_MODE_SLAVE)
&& (p_a[i].wrsPortStatusLink == WRS_PORT_STATUS_LINK_DOWN)) {
wrsTimingStatus_s.wrsSlaveLinksStatus =
WRS_SLAVE_LINK_STATUS_ERROR;
snmp_log(LOG_ERR, "SNMP: wrsSlaveLinksStatus (slave) "
"failed for port %d (wri%d)\n",
i + 1, i + 1);
t->wrsSlaveLinksStatus = WRS_SLAVE_LINK_STATUS_ERROR;
snmp_log(LOG_ERR, "SNMP: " SL_ER " %s: "
"In Boundary Clock mode, port %d (wri%d) configured as slave is down\n",
slog_obj_name, i + 1, i + 1);
}
/* error when slave port is up when switch is in master or
* grandmaster mode */
if (((hal_shmem->hal_mode == HAL_TIMING_MODE_GRAND_MASTER) || (hal_shmem->hal_mode == HAL_TIMING_MODE_FREE_MASTER))
&& (p_a[i].wrsPortStatusConfiguredMode == WRS_PORT_STATUS_CONFIGURED_MODE_SLAVE)
if ((p_a[i].wrsPortStatusConfiguredMode == WRS_PORT_STATUS_CONFIGURED_MODE_SLAVE)
&& (p_a[i].wrsPortStatusLink == WRS_PORT_STATUS_LINK_UP)) {
wrsTimingStatus_s.wrsSlaveLinksStatus =
WRS_SLAVE_LINK_STATUS_ERROR;
snmp_log(LOG_ERR, "SNMP: wrsSlaveLinksStatus (master) "
"failed for port %d (wri%d)\n",
i + 1, i + 1);
if (hal_shmem->hal_mode == HAL_TIMING_MODE_GRAND_MASTER) {
t->wrsSlaveLinksStatus = WRS_SLAVE_LINK_STATUS_ERROR;
snmp_log(LOG_ERR, "SNMP: " SL_ER " %s: "
"In Grand Master mode, port %d (wri%d) configured as slave is up\n",
slog_obj_name, i + 1, i + 1);
snmp_log(LOG_ERR, "SNMP: " SL_ER " %s: "
"In Grand Master mode slave ports cannot be used\n",
slog_obj_name);
}
if (hal_shmem->hal_mode == HAL_TIMING_MODE_FREE_MASTER) {
t->wrsSlaveLinksStatus = WRS_SLAVE_LINK_STATUS_ERROR;
snmp_log(LOG_ERR, "SNMP: " SL_ER " %s: "
"In Free-running Master mode, port %d (wri%d) configured as slave is up\n",
slog_obj_name, i + 1, i + 1);
snmp_log(LOG_ERR, "SNMP: " SL_ER " %s: "
"In Free-running Master mode slave ports cannot be used\n",
slog_obj_name);
}
}
}
}
......@@ -264,6 +393,7 @@ static void get_wrsSlaveLinksStatus(unsigned int port_status_nrows)
static void get_wrsPTPFramesFlowing(unsigned int port_status_nrows)
{
struct wrsPortStatusTable_s *p_a;
struct wrsTimingStatus_s *t;
int i;
static int first_run = 1;
......@@ -278,35 +408,63 @@ static void get_wrsPTPFramesFlowing(unsigned int port_status_nrows)
* Check if PTP frames are flowing. Check only on ports that are
* non-wr and up.
*/
p_a = wrsPortStatusTable_array;
wrsTimingStatus_s.wrsPTPFramesFlowing = WRS_PTP_FRAMES_FLOWING_OK;
t = &wrsTimingStatus_s;
slog_obj_name = wrsPTPFramesFlowing_str;
t->wrsPTPFramesFlowing = WRS_PTP_FRAMES_FLOWING_OK;
for (i = 0; i < port_status_nrows; i++) {
if (first_run == 1) {
/* don't report errors during first run */
wrsTimingStatus_s.wrsPTPFramesFlowing =
WRS_PTP_FRAMES_FLOWING_FR;
t->wrsPTPFramesFlowing = WRS_PTP_FRAMES_FLOWING_FR;
/* no need to check others */
break;
/* Error when there is no increase in TX/RX PTP counters.
Check only when port is non-wr and port is down */
} else if ((p_a[i].wrsPortStatusConfiguredMode != WRS_PORT_STATUS_CONFIGURED_MODE_NON_WR)
&& (p_a[i].wrsPortStatusLink == WRS_PORT_STATUS_LINK_UP)
&& ((wrsPortStatusPtpTxFrames_prev[i] == p_a[i].wrsPortStatusPtpTxFrames)
|| (wrsPortStatusPtpRxFrames_prev[i] == p_a[i].wrsPortStatusPtpRxFrames))) {
wrsTimingStatus_s.wrsPTPFramesFlowing =
WRS_PTP_FRAMES_FLOWING_ERROR;
snmp_log(LOG_ERR, "SNMP: wrsPTPFramesFlowing "
"failed for port %d (wri%d)\n",
i + 1, i + 1);
/* can't go worse, no need to change other ports */
break;
/* warning N/A */
} else if (p_a[i].wrsPortStatusConfiguredMode == 0
|| p_a[i].wrsPortStatusLink == 0){
wrsTimingStatus_s.wrsPTPFramesFlowing =
WRS_PTP_FRAMES_FLOWING_WARNING_NA;
}
if ((p_a[i].wrsPortStatusConfiguredMode != WRS_PORT_STATUS_CONFIGURED_MODE_NON_WR)
&& (p_a[i].wrsPortStatusLink == WRS_PORT_STATUS_LINK_UP)) {
if (wrsPortStatusPtpTxFrames_prev[i] == p_a[i].wrsPortStatusPtpTxFrames) {
t->wrsPTPFramesFlowing = WRS_PTP_FRAMES_FLOWING_ERROR;
snmp_log(LOG_ERR, "SNMP: " SL_ER " %s: "
"No TX PTP frames flowing for port %i (wri%i) which is up and in WR mode\n",
slog_obj_name, i + 1, i + 1);
}
if (wrsPortStatusPtpRxFrames_prev[i] == p_a[i].wrsPortStatusPtpRxFrames) {
t->wrsPTPFramesFlowing = WRS_PTP_FRAMES_FLOWING_ERROR;
snmp_log(LOG_ERR, "SNMP: " SL_ER " %s: "
"No RX PTP frames flowing for port %i (wri%i) which is up and in WR mode\n",
slog_obj_name, i + 1, i + 1);
}
/* can't go worse, but check other ports for logging */
/* Warning N/A, skip when already error. Will not reach this
* point for first read */
}
if (p_a[i].wrsPortStatusConfiguredMode == 0) {
/* assign if not error */
if (t->wrsPTPFramesFlowing != WRS_PTP_FRAMES_FLOWING_ERROR) {
t->wrsPTPFramesFlowing = WRS_PTP_FRAMES_FLOWING_WARNING_NA;
}
/* Log always for every port */
snmp_log(LOG_ERR, "SNMP: " SL_NA " %s: "
"Status of wrsPortStatusConfiguredMode not available "
"for port %i (wri%i)\n",
slog_obj_name, i + 1, i + 1);
/* continue with other ports, somewhere may be an
* error */
}
if (p_a[i].wrsPortStatusLink == 0){
/* assign if not error */
if (t->wrsPTPFramesFlowing != WRS_PTP_FRAMES_FLOWING_ERROR) {
t->wrsPTPFramesFlowing = WRS_PTP_FRAMES_FLOWING_WARNING_NA;
}
/* Log always for every port */
snmp_log(LOG_ERR, "SNMP: " SL_NA " %s: "
"Status of wrsPortStatusLink not available "
"for port %i (wri%i)\n",
slog_obj_name, i + 1, i + 1);
/* continue with other ports, somewhere may be an
* error */
}
......
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