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

Merge branch 'adam-snmp'


Improvement of snmp

Signed-off-by: default avatarAdam Wujek <adam.wujek@cern.ch>
parents 41061669 cb78bf7e
Branches
Tags
No related merge requests found
Showing
with 1122 additions and 103 deletions
......@@ -107,15 +107,11 @@ struct hal_temp_sensors {
int pll; /* IC18 */
int psl; /* IC20 Power Supply Left (PSL) */
int psr; /* IC17 Power Supply Right (PSR) */
int fpga_thold; /* Threshold value for FPGA temperature */
int pll_thold; /* Threshold value for PLL temperature */
int psl_thold; /* Threshold value for PSL temperature */
int psr_thold; /* Threshold value for PSR temperature */
};
/* This is the overall structure stored in shared memory */
#define HAL_SHMEM_VERSION 6 /* Version 6 because of new structure
* hal_temp_sensors in hal_shmem_header */
#define HAL_SHMEM_VERSION 7 /* Version 7 because of moving of reading
* temperature treshold values to snmpd */
struct hal_shmem_header {
int nports;
struct hal_port_state *ports;
......
ppsi @ b8ebe5fe
Subproject commit 782773077690f2b2d53af0395e3b94e8fcc89a9d
Subproject commit b8ebe5fee29e094175bb7d349483fdc651de146e
......@@ -32,12 +32,17 @@ SOURCES = \
wrsScalar.c \
wrsGeneralStatusGroup.c \
wrsOSStatusGroup.c \
wrsTimingStatusGroup.c \
wrsNetworkingStatusGroup.c \
wrsVersionGroup.c \
wrsCurrentTimeGroup.c \
wrsBootStatusGroup.c \
wrsTemperatureGroup.c \
wrsMemoryGroup.c \
wrsCpuLoadGroup.c \
wrsDiskTable.c \
wrsStartCntGroup.c \
wrsSpllVersionGroup.c \
wrsSpllStatusGroup.c \
wrsPstatsTable.c \
wrsPtpDataTable.c \
......
......@@ -93,6 +93,26 @@ wrsOSStatus OBJECT-TYPE
bug - bug in checking conditions of wrsOSStatusGroup, please report"
::= { wrsGeneralStatusGroup 2 }
wrsTimingStatus 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 wrsTimingStatusGroup
ok - values in wrsTimingStatusGroup are correct
error - there is an error in wrsTimingStatusGroup
warning - there is a warning in wrsTimingStatusGroup
warningNA - there is N/A field in wrsTimingStatusGroup
bug - bug in checking conditions of wrsTimingStatusGroup, please report"
::= { wrsGeneralStatusGroup 3 }
wrsNetworkingStatus OBJECT-TYPE
SYNTAX INTEGER {
na(0),
......@@ -113,6 +133,7 @@ wrsNetworkingStatus OBJECT-TYPE
bug - bug in checking conditions of wrsNetworkingStatusGroup, please report"
::= { wrsGeneralStatusGroup 4 }
-- wrsDetailedStatusesGroup (.6.2)
wrsDetailedStatusesGroup OBJECT IDENTIFIER ::= { wrsStatus 2 }
-- wrsOSStatusGroup (.6.2.1)
......@@ -151,10 +172,131 @@ wrsTemperatureWarning OBJECT-TYPE
"Warning if temperature exceed threshold levels"
::= { wrsOSStatusGroup 2 }
wrsMemoryFreeLow OBJECT-TYPE
SYNTAX INTEGER {
na(0),
ok(1),
error(2),
warning(3),
warningNA(4)
}
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Status of free memory. Based on wrsMemoryGroup.
Error - more than 80% memory used
Warning - more than 50% memory used"
::= { wrsOSStatusGroup 3 }
wrsCpuLoadHigh OBJECT-TYPE
SYNTAX INTEGER {
na(0),
ok(1),
error(2),
warning(3)
}
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Status of CPU load. Based on averag load in group wrsCpuLoad.
Error - average CPU load is more than 3 for 1min, 2 for 5min and 1.5 for 15min
Warning - average CPU load is more than 2 for 1min, 1.5 for 5min and 1 for 15min"
::= { wrsOSStatusGroup 4 }
wrsDiskSpaceLow OBJECT-TYPE
SYNTAX INTEGER {
na(0),
ok(1),
error(2),
warning(3),
warningNA(4)
}
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Status of used disk space. Based on wrsDiskTable.
Error - more than 90% of any disk is used
Warning - more than 80% of any disk is used"
::= { wrsOSStatusGroup 5 }
-- wrsTimingStatusGroup (.6.2.2)
wrsTimingStatusGroup OBJECT IDENTIFIER ::= { wrsDetailedStatusesGroup 2 }
wrsPTPStatus OBJECT-TYPE
SYNTAX INTEGER {
na(0),
ok(1),
error(2),
firstRead(6),
}
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Grouped status of wrsPtpDataTable
ok - PTP error counters in wrsPtpDataTable are not increased since
last scan and ptp servo updates counter increased
error - error in wrsPtpDataTable
firstRead - unable to calculate deltas in first read"
::= { wrsTimingStatusGroup 1 }
wrsSoftPLLStatus 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 wrsSpllState
ok - values in wrsSpllState are correct
error - there is an error in wrsSpllState
warning - there is a warning in wrsSpllState
warningNA - there is N/A field in wrsSpllState
bug - bug in checking conditions of wrsSpllState, please report"
::= { wrsTimingStatusGroup 2 }
wrsSlaveLinksStatus OBJECT-TYPE
SYNTAX INTEGER {
na(0),
ok(1),
error(2),
warningNA(4)
}
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Grouped status of slave link statuses
ok - when every slave port is up when switch is in slave mode
and when every slave port is down when switch in master/grandmaster mode
don't care about non-wr and auto ports
warningNA - there is N/A in wrsSpllMode, wrsPortStatusLink or
wrsPortStatusConfiguredMode"
::= { wrsTimingStatusGroup 3 }
--wrsTimingStatusGroup OBJECT IDENTIFIER ::= { wrsDetailedStatusesGroup 2 }
wrsPTPFramesFlowing OBJECT-TYPE
SYNTAX INTEGER {
na(0),
ok(1),
error(2),
warningNA(4),
firstRead(6)
}
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Grouped status of TX and RX PTP packets flowing
ok - when there are PTP packets flowing in both directions on all
wr ports that are up
warningNA - there is N/A in wrsPortStatusLink or wrsPortStatusConfiguredMode
error - no PTP packets flowing at least on one wr up port
firstRead - unable to calculate deltas in first read"
::= { wrsTimingStatusGroup 4 }
-- wrsNetworkingStatusGroup (.6.1.3)
-- wrsNetworkingStatusGroup (.6.2.3)
wrsNetworkingStatusGroup OBJECT IDENTIFIER ::= { wrsDetailedStatusesGroup 3 }
wrsSFPsStatus OBJECT-TYPE
......@@ -180,9 +322,9 @@ wrsSFPsStatus OBJECT-TYPE
wrsEndpointStatus OBJECT-TYPE
SYNTAX INTEGER {
na(0),
firstRead(1),
ok(2),
error(3)
ok(1),
error(2),
firstRead(6)
}
MAX-ACCESS read-only
STATUS current
......@@ -197,9 +339,9 @@ wrsEndpointStatus OBJECT-TYPE
wrsSwcoreStatus OBJECT-TYPE
SYNTAX INTEGER {
na(0),
firstRead(1),
ok(2),
error(3)
ok(1),
error(2),
firstRead(6)
}
MAX-ACCESS read-only
STATUS current
......@@ -215,9 +357,9 @@ wrsSwcoreStatus OBJECT-TYPE
wrsRTUStatus OBJECT-TYPE
SYNTAX INTEGER {
na(0),
firstRead(1),
ok(2),
error(3)
ok(1),
error(2),
firstRead(6)
}
MAX-ACCESS read-only
STATUS current
......@@ -345,6 +487,7 @@ wrsVersionLastUpdateDate OBJECT-TYPE
ccurate, due to hard restarts or lack of proper time."
::= { wrsVersionGroup 14 }
-- wrsOperationStatus (.7.1)
wrsOperationStatus OBJECT IDENTIFIER ::= { wrsExpertStatus 1 }
-- wrsCurrentTimeGroup (.7.1.1)
......@@ -627,9 +770,156 @@ wrsTempThresholdPSR OBJECT-TYPE
"Threshold level for Power Supply Right (PSR) temperature"
::= { wrsTemperatureGroup 8 }
wrsStartCntGroup OBJECT IDENTIFIER ::= { wrsExpertStatus 2 }
-- wrsMemoryGroup (.7.1.4)
wrsMemoryGroup OBJECT IDENTIFIER ::= { wrsOperationStatus 4 }
wrsMemoryTotal OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Ram size in kB"
::= { wrsMemoryGroup 1 }
wrsMemoryUsed OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Used RAM in kB (Cache and buffers are not counted)"
::= { wrsMemoryGroup 2 }
wrsMemoryUsedPerc OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Percentage of used RAM"
::= { wrsMemoryGroup 3 }
wrsMemoryFree OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Free RAM in kB"
::= { wrsMemoryGroup 4 }
-- wrsCpuLoadGroup (.7.1.5)
wrsCpuLoadGroup OBJECT IDENTIFIER ::= { wrsOperationStatus 5 }
wrsCPULoadAvg1min OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Load average over 1min multiplied by 100"
::= { wrsCpuLoadGroup 1 }
wrsCPULoadAvg5min OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Load average over 5min multiplied by 100"
::= { wrsCpuLoadGroup 2 }
wrsCPULoadAvg15min OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Load average over 15min multiplied by 100"
::= { wrsCpuLoadGroup 3 }
-- wrsDiskTable (.7.1.6)
wrsDiskTable OBJECT-TYPE
SYNTAX SEQUENCE OF WrsDiskEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"Information for each mounted partition"
::= { wrsOperationStatus 6 }
wrsDiskEntry OBJECT-TYPE
SYNTAX WrsDiskEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"An entry containing partitions' details"
INDEX { wrsDiskIndex }
::= { wrsDiskTable 1 }
WrsDiskEntry ::=
SEQUENCE {
wrsDiskIndex Unsigned32,
wrsDiskMountPath DisplayString,
wrsDiskSize Integer32,
wrsDiskUsed Integer32,
wrsDiskFree Integer32,
wrsDiskUseRate Integer32,
wrsDiskFilesystem DisplayString
}
wrsDiskIndex OBJECT-TYPE
SYNTAX Unsigned32
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"Index for wrsDiskTable"
::= { wrsDiskEntry 1 }
wrsDiskMountPath OBJECT-TYPE
SYNTAX DisplayString (SIZE (0..32))
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Mount patch of reported partition"
::= { wrsDiskEntry 2 }
wrsDiskSize OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Partition size"
::= { wrsDiskEntry 3 }
wrsDiskUsed OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Used space on partition"
::= { wrsDiskEntry 4 }
wrsDiskFree OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Free space on partition"
::= { wrsDiskEntry 5 }
wrsDiskUseRate OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Percentage of used space on partition"
::= { wrsDiskEntry 6 }
wrsDiskFilesystem OBJECT-TYPE
SYNTAX DisplayString (SIZE (0..64))
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Filesystem reported by df command"
::= { wrsDiskEntry 7 }
-- wrsStartCntGroup (.7.2)
wrsStartCntGroup OBJECT IDENTIFIER ::= { wrsExpertStatus 2 }
wrsStartCntHAL OBJECT-TYPE
SYNTAX Counter32
MAX-ACCESS read-only
......@@ -686,16 +976,42 @@ wrsStartCntSyslogd OBJECT-TYPE
"Nmber of SYSLOG deamon starts"
::= { wrsStartCntGroup 7 }
-- wrsSpllState (.7.3)
wrsSpllState OBJECT IDENTIFIER ::= { wrsExpertStatus 3 }
-- wrsSpllVersionGroup (.7.3.1)
wrsSpllVersionGroup OBJECT IDENTIFIER ::= { wrsSpllState 1 }
wrsSpllVersion OBJECT-TYPE
SYNTAX DisplayString (SIZE (0..32))
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The spll version, as returned from 'git describe' at build time"
::= { wrsSpllVersionGroup 1 }
wrsSpllBuildDate OBJECT-TYPE
SYNTAX DisplayString (SIZE (0..32))
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The build date of the spll, '__DATE__' at build time"
::= { wrsSpllVersionGroup 2 }
-- wrsSpllStatusGroup (.7.3.2)
wrsSpllStatusGroup OBJECT IDENTIFIER ::= { wrsSpllState 2 }
wrsSpllMode OBJECT-TYPE
SYNTAX Integer32
SYNTAX INTEGER {
na(0),
grandmaster(1),
master(2),
slave(3)
}
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Mode of Soft PLL"
"Mode of Soft PLL (values taken from softpll_ng.h)"
::= { wrsSpllStatusGroup 1 }
wrsSpllIrqCnt OBJECT-TYPE
......@@ -707,19 +1023,40 @@ wrsSpllIrqCnt OBJECT-TYPE
::= { wrsSpllStatusGroup 2 }
wrsSpllSeqState OBJECT-TYPE
SYNTAX Integer32
SYNTAX INTEGER {
startExt(1),
waitExt(2),
startHelper(3),
waitHelper(4),
startMain(5),
waitMain(6),
disabled(7),
ready(8),
clearDacs(9),
waitClearDacs(10)
}
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Sequence state of Soft PLL"
"Sequence state of Soft PLL (values taken from file softpll_ng.c in wrpc-sw repo)"
::= { wrsSpllStatusGroup 3 }
wrsSpllAlignState OBJECT-TYPE
SYNTAX Integer32
SYNTAX INTEGER {
extOff(0),
start(1),
initCsync(2),
waitCsync(3),
waitSample(4),
compensateDelay(5),
locked(6),
startAlignment(7),
startMain(8)
}
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Align state of Soft PLL"
"Align state of Soft PLL (values taken from file spll_external.c in wrpc-sw repo)"
::= { wrsSpllStatusGroup 4 }
wrsSpllHlock OBJECT-TYPE
......@@ -762,13 +1099,13 @@ wrsSpllDelCnt OBJECT-TYPE
"Del counter at Soft PLL"
::= { wrsSpllStatusGroup 9 }
-- wrsPstatsTable (.7.1.4)
-- wrsPstatsTable (.7.4)
wrsPstatsTable OBJECT-TYPE
SYNTAX SEQUENCE OF WrsPstatsEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"Information for each ptp servo"
"Pstats counters for each port"
::= { wrsExpertStatus 4 }
wrsPstatsEntry OBJECT-TYPE
......@@ -776,7 +1113,7 @@ wrsPstatsEntry OBJECT-TYPE
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"An entry containing ptp servo statuses"
"An entry containing pstats counters"
INDEX { wrsPstatsIndex }
::= { wrsPstatsTable 1 }
......@@ -1163,7 +1500,7 @@ wrsPstatsTRURespValid OBJECT-TYPE
"Number of TRU decisions"
::= { wrsPstatsEntry 41 }
-- wrsPtpDataTable (.7.1.5)
-- wrsPtpDataTable (.7.5)
wrsPtpDataTable OBJECT-TYPE
SYNTAX SEQUENCE OF WrsPtpDataEntry
MAX-ACCESS not-accessible
......@@ -1201,7 +1538,11 @@ WrsPtpDataEntry ::=
wrsPtpDeltaTxM Integer32,
wrsPtpDeltaRxM Integer32,
wrsPtpDeltaTxS Integer32,
wrsPtpDeltaRxS Integer32
wrsPtpDeltaRxS Integer32,
wrsPtpServoStateErrCnt Counter32,
wrsPtpClockOffsetErrCnt Counter32,
wrsPtpRTTErrCnt Counter32,
wrsPtpDeltaRxTxErrCnt Counter32
}
wrsPtpDataIndex OBJECT-TYPE
......@@ -1372,7 +1713,39 @@ wrsPtpDeltaRxS OBJECT-TYPE
"Fixed Rx latency on Slave side"
::= { wrsPtpDataEntry 19 }
-- per-port (.7.1.6)
wrsPtpServoStateErrCnt OBJECT-TYPE
SYNTAX Counter32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Number of servo updates with wrong servo state"
::= { wrsPtpDataEntry 20 }
wrsPtpClockOffsetErrCnt OBJECT-TYPE
SYNTAX Counter32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Number of servo updates with wrong clock offset"
::= { wrsPtpDataEntry 21 }
wrsPtpRTTErrCnt OBJECT-TYPE
SYNTAX Counter32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Number of servo updates with wrong RTT"
::= { wrsPtpDataEntry 22 }
wrsPtpDeltaRxTxErrCnt OBJECT-TYPE
SYNTAX Counter32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Number of servo updates with wrong Delta TX/RX M/S"
::= { wrsPtpDataEntry 23 }
-- wrsPortStatusTable (.7.6)
wrsPortStatusTable OBJECT-TYPE
SYNTAX SEQUENCE OF WrsPortStatusEntry
MAX-ACCESS not-accessible
......@@ -1395,7 +1768,7 @@ WrsPortStatusEntry ::=
wrsPortStatusIndex Unsigned32,
wrsPortStatusPortName DisplayString,
wrsPortStatusLink INTEGER,
wrsPortStatusMode INTEGER,
wrsPortStatusConfiguredMode INTEGER,
wrsPortStatusLocked INTEGER,
wrsPortStatusPeer OCTET STRING,
wrsPortStatusSfpVN DisplayString,
......@@ -1403,7 +1776,9 @@ WrsPortStatusEntry ::=
wrsPortStatusSfpVS DisplayString,
wrsPortStatusSfpInDB INTEGER,
wrsPortStatusSfpGbE INTEGER,
wrsPortStatusSfpError INTEGER
wrsPortStatusSfpError INTEGER,
wrsPortStatusPtpTxFrames Counter32,
wrsPortStatusPtpRxFrames Counter32,
}
wrsPortStatusIndex OBJECT-TYPE
......@@ -1434,7 +1809,7 @@ wrsPortStatusLink OBJECT-TYPE
"Whether the link is up or down"
::= { wrsPortStatusEntry 3 }
wrsPortStatusMode OBJECT-TYPE
wrsPortStatusConfiguredMode OBJECT-TYPE
SYNTAX INTEGER {
unknown(0),
master(1),
......@@ -1445,7 +1820,7 @@ wrsPortStatusMode OBJECT-TYPE
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Whether the port is master or slave"
"Whether the port is configured as master, slave, non-wr or auto"
::= { wrsPortStatusEntry 4 }
wrsPortStatusLocked OBJECT-TYPE
......@@ -1521,6 +1896,24 @@ wrsPortStatusSfpError OBJECT-TYPE
"Problem with SFP configuration. Port has to be always 1GbE. Port has to be in data base as long as support WR."
::= { wrsPortStatusEntry 12 }
wrsPortStatusPtpTxFrames OBJECT-TYPE
SYNTAX Counter32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Number of transmitted PTP frames per port (for all PPSI instances
running on particular port"
::= { wrsPortStatusEntry 13 }
wrsPortStatusPtpRxFrames OBJECT-TYPE
SYNTAX Counter32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Number of received PTP frames per port (for all PPSI instances
running on particular port"
::= { wrsPortStatusEntry 14 }
--wrsNetworking
--Configuration
......
......@@ -11,12 +11,17 @@
#include "libwr/config.h"
#include "wrsGeneralStatusGroup.h"
#include "wrsOSStatusGroup.h"
#include "wrsTimingStatusGroup.h"
#include "wrsNetworkingStatusGroup.h"
#include "wrsVersionGroup.h"
#include "wrsCurrentTimeGroup.h"
#include "wrsBootStatusGroup.h"
#include "wrsTemperatureGroup.h"
#include "wrsMemoryGroup.h"
#include "wrsCpuLoadGroup.h"
#include "wrsDiskTable.h"
#include "wrsStartCntGroup.h"
#include "wrsSpllVersionGroup.h"
#include "wrsSpllStatusGroup.h"
#include "wrsPstatsTable.h"
#include "wrsPtpDataTable.h"
......@@ -38,14 +43,24 @@ void init_wrsSnmp(void)
init_wrsScalar();
init_wrsGeneralStatusGroup();
init_wrsOSStatusGroup();
init_wrsTimingStatusGroup();
init_wrsNetworkingStatusGroup();
init_wrsVersionGroup();
init_wrsCurrentTimeGroup();
init_wrsBootStatusGroup();
init_wrsTemperatureGroup();
init_wrsMemoryGroup();
init_wrsCpuLoadGroup();
init_wrsDiskTable();
init_wrsStartCntGroup();
init_wrsSpllVersionGroup();
init_wrsSpllStatusGroup();
init_wrsPstatsTable();
init_wrsPtpDataTable();
init_wrsPortStatusTable();
/* perform first reads, needed to calculate deltas later */
wrsTimingStatus_data_fill();
wrsNetworkingStatus_data_fill();
}
......@@ -11,6 +11,8 @@ int hal_nports_local;
struct wrs_shm_head *ppsi_head;
static struct pp_globals *ppg;
struct wr_servo_state *ppsi_servo;
struct pp_instance *ppsi_ppi;
int *ppsi_ppi_nlinks;
/* RTUd */
struct wrs_shm_head *rtud_head;
......@@ -74,6 +76,13 @@ static void init_shm_ppsi(void)
exit(-1);
}
ppsi_ppi = wrs_shm_follow(ppsi_head, ppg->pp_instances);
if (!ppsi_ppi) {
snmp_log(LOG_ERR, "Cannot follow ppsi_ppi in shmem.\n");
exit(-1);
}
/* use pointer instead of copying */
ppsi_ppi_nlinks = &(ppg->nlinks);
}
static void init_shm_rtud(void)
......
......@@ -16,6 +16,8 @@ extern int hal_nports_local;
/* PPSI */
extern struct wrs_shm_head *ppsi_head;
extern struct wr_servo_state *ppsi_servo;
extern struct pp_instance *ppsi_ppi;
extern int *ppsi_ppi_nlinks;
/* RTUd */
struct wrs_shm_head *rtud_head;
......
......@@ -129,7 +129,10 @@ int spll_get_dac(int out_channel);
void check_vco_frequencies();
#define SPLL_STATS_VER 2
/* info reported through .stat section */
/* due to endiannes problem strings has to be 4 bytes alligned */
struct spll_stats {
int magic; /* 0x5b1157a7 = SPLLSTAT ?;)*/
int ver; /* version of the structure */
......@@ -142,6 +145,10 @@ struct spll_stats {
int M_lock;
int H_y, M_y;
int del_cnt;
int start_cnt;
char commit_id[32];
char build_date[16];
char build_time[16];
};
/* This only exists in wr-switch, but we should use it always */
......
......@@ -8,7 +8,7 @@
#define DOTCONFIG_PROTO "dot-config_proto"
#define DOTCONFIG_HOST "dot-config_host"
#define DOTCONFIG_FILENAME "dot-config_filename"
#define DOTCONFIG_DOWNLOAD "dot-config_status"
#define DOTCONFIG_STATUS "dot-config_status"
#define HWINFO_FILE "/tmp/hwinfo_read_status"
#define LOAD_FPGA_STATUS_FILE "/tmp/load_fpga_status"
......@@ -63,19 +63,27 @@ static struct wrs_km_item kernel_modules[] = {
/* user space deamon list item */
struct wrs_usd_item {
char *key;
char *key; /* process name */
int32_t exp; /* expected number of processes */
uint32_t cnt; /* number of processes found */
};
/* user space deamon list */
static struct wrs_km_item userspace_deamons[] = {
[0] = {.key = "/usr/sbin/dropbear"},
[1] = {"/wr/bin/wrsw_hal"}, /* two wrsw_hal instances */
[2] = {"/wr/bin/wrsw_hal"}, /* two wrsw_hal instances */
[3] = {"/wr/bin/wrsw_rtud"},
[4] = {"/wr/bin/ppsi"},
[5] = {"/usr/sbin/lighttpd"},
[6] = {"/usr/bin/monit"},
[7] = {"snmpd"},
/* - key contain process name reported by ps command
* - positive exp describe exact number of expected processes
* - negative exp describe minimum number of expected processes. Usefull for
* processes that is hard to predict number of their instances. For example
* new dropbear process is spawned at ssh login.
*/
static struct wrs_usd_item userspace_deamons[] = {
[0] = {.key = "/usr/sbin/dropbear", .exp = -1}, /* expect at least one
* dropbear process */
[1] = {"/wr/bin/wrsw_hal", 2}, /* two wrsw_hal instances */
[2] = {"/wr/bin/wrsw_rtud", 1},
[3] = {"/wr/bin/ppsi", 1},
[4] = {"/usr/sbin/lighttpd", 1},
[5] = {"/usr/bin/monit", 1},
[6] = {"/usr/sbin/snmpd", 1},
};
struct wrs_bc_item {
......@@ -185,32 +193,38 @@ static void get_dotconfig_source(void)
WRS_CONFIG_SOURCE_PROTO_ERROR_MINOR;
}
/* read host used to get dotconfig */
f = fopen(DOTCONFIGDIR "/" DOTCONFIG_HOST, "r");
if (f) {
/* readline without newline */
fscanf(f, LINE_READ_LEN(WRS_CONFIG_SOURCE_HOST_LEN),
wrsBootStatus_s.wrsConfigSourceHost);
fclose(f);
} else {
/* host file not found, put "error" into wrsConfigSourceHost */
strcpy(wrsBootStatus_s.wrsConfigSourceHost, "error");
}
/* read hostname and file name only when config is not local */
if (wrsBootStatus_s.wrsConfigSource != WRS_CONFIG_SOURCE_PROTO_LOCAL) {
/* read host used to get dotconfig */
f = fopen(DOTCONFIGDIR "/" DOTCONFIG_HOST, "r");
if (f) {
/* readline without newline */
fscanf(f, LINE_READ_LEN(WRS_CONFIG_SOURCE_HOST_LEN),
wrsBootStatus_s.wrsConfigSourceHost);
fclose(f);
} else {
/* host file not found, put "error" into
* wrsConfigSourceHost */
strcpy(wrsBootStatus_s.wrsConfigSourceHost, "error");
}
/* read filename used to get dotconfig */
f = fopen(DOTCONFIGDIR "/" DOTCONFIG_FILENAME, "r");
if (f) {
/* readline without newline */
fscanf(f, LINE_READ_LEN(WRS_CONFIG_SOURCE_FILENAME_LEN),
wrsBootStatus_s.wrsConfigSourceFilename);
fclose(f);
} else {
/* host file not found, put "error" into
* wrsConfigSourceFilename */
strcpy(wrsBootStatus_s.wrsConfigSourceFilename, "error");
/* read filename used to get dotconfig */
f = fopen(DOTCONFIGDIR "/" DOTCONFIG_FILENAME, "r");
if (f) {
/* readline without newline */
fscanf(f,
LINE_READ_LEN(WRS_CONFIG_SOURCE_FILENAME_LEN),
wrsBootStatus_s.wrsConfigSourceFilename);
fclose(f);
} else {
/* host file not found, put "error" into
* wrsConfigSourceFilename */
strcpy(wrsBootStatus_s.wrsConfigSourceFilename,
"error");
}
}
f = fopen(DOTCONFIGDIR "/" DOTCONFIG_DOWNLOAD, "r");
f = fopen(DOTCONFIGDIR "/" DOTCONFIG_STATUS, "r");
if (f) {
/* readline without newline */
fscanf(f, LINE_READ_LEN(20), buff);
......@@ -322,10 +336,10 @@ static void get_loaded_kernel_modules_status(void)
{
FILE *f;
char key[41]; /* 1 for null char */
int modules_found;
int ret;
int modules_found = 0;
int ret = 0;
int i;
int guess_index;
int guess_index = 0;
int modules_missing;
f = fopen(MODULES_FILE, "r");
......@@ -372,23 +386,36 @@ static void get_deamons_status(void)
{
FILE *f;
char key[41]; /* 1 for null char */
int ret;
int ret = 0;
int i;
int processes_found;
int processes_missing;
int processes_wrong = 0; /* number of too many or too few processes */
/* clear user space deamon counters */
for (i = 0; i < ARRAY_SIZE(userspace_deamons); i++) {
userspace_deamons[i].cnt = 0;
}
/* use ps command to get process list, more portable, less error prone
/* Use ps command to get process list, more portable, less error prone
* 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");
/* notify snmp about error in processes list */
wrsBootStatus_s.wrsBootUserspaceDaemonsMissing =
ARRAY_SIZE(userspace_deamons);
wrsBootStatus_s.wrsBootUserspaceDaemonsMissing = 0;
/* Notify snmp about error in processes list */
/* Count number of expected processes */
for (i = 0; i < ARRAY_SIZE(userspace_deamons); i++) {
/* when exp < 0 then expect at least number of
* -exp processes */
wrsBootStatus_s.wrsBootUserspaceDaemonsMissing +=
abs(userspace_deamons[i].exp);
}
return;
}
/* count processes */
while (ret != EOF) {
/* read first word from line (process name) ignore rest of
* the line */
......@@ -399,22 +426,32 @@ static void get_deamons_status(void)
for (i = 0; i < ARRAY_SIZE(userspace_deamons); i++) {
if (strncmp(key, userspace_deamons[i].key, 40))
continue;
processes_found++;
userspace_deamons[i].cnt++;
break;
}
}
processes_missing = ARRAY_SIZE(userspace_deamons) - processes_found;
for (i = 0; i < ARRAY_SIZE(userspace_deamons); i++) {
if (userspace_deamons[i].exp < 0) {
/* if exp < 0 then expect at least -exp processes,
* useful in situation when we cannot predict exact
* number of processes.
* NOTE: exp in this case is negative number */
/* saturate cnt */
if (userspace_deamons[i].cnt > (-userspace_deamons[i].exp)) {
userspace_deamons[i].cnt =
(-userspace_deamons[i].exp);
}
}
/* Calculate delta between expected and counted number
* of processes. Neither too much or too few are ok.
* NOTE: abs "exp" too */
processes_wrong += abs(abs(userspace_deamons[i].exp)
- userspace_deamons[i].cnt);
}
/* save number of processes missing */
if (processes_missing < 0) {
/* probably something wrong with multiple process' instances */
wrsBootStatus_s.wrsBootUserspaceDaemonsMissing =
ARRAY_SIZE(userspace_deamons);
} else {
wrsBootStatus_s.wrsBootUserspaceDaemonsMissing =
processes_missing;
}
wrsBootStatus_s.wrsBootUserspaceDaemonsMissing = processes_wrong;
pclose(f);
}
......
#include "wrsSnmp.h"
#include "wrsCpuLoadGroup.h"
#include <sys/sysinfo.h> /* sysinfo */
static struct pickinfo wrsCpuLoad_pickinfo[] = {
FIELD(wrsCpuLoad_s, ASN_INTEGER, wrsCPULoadAvg1min),
FIELD(wrsCpuLoad_s, ASN_INTEGER, wrsCPULoadAvg5min),
FIELD(wrsCpuLoad_s, ASN_INTEGER, wrsCPULoadAvg15min),
};
struct wrsCpuLoad_s wrsCpuLoad_s;
time_t wrsCpuLoad_data_fill(void)
{
static time_t time_update;
time_t time_cur;
struct sysinfo info;
time_cur = time(NULL);
if (time_update
&& time_cur - time_update < WRSCPULOAD_CACHE_TIMEOUT) {
/* cache not updated, return last update time */
return time_update;
}
time_update = time_cur;
memset(&wrsCpuLoad_s, 0, sizeof(wrsCpuLoad_s));
if (sysinfo(&info) != 0) {
snmp_log(LOG_ERR, "SNMP: wrsMemoryGroup error while reading "
"system statistics with function sysinfo\n");
}
wrsCpuLoad_s.wrsCPULoadAvg1min =
(info.loads[0] * 100)/(1 << SI_LOAD_SHIFT);
wrsCpuLoad_s.wrsCPULoadAvg5min =
(info.loads[1] * 100)/(1 << SI_LOAD_SHIFT);
wrsCpuLoad_s.wrsCPULoadAvg15min =
(info.loads[2] * 100)/(1 << SI_LOAD_SHIFT);
/* there was an update, return current time */
return time_update;
}
#define GT_OID WRSCPULOAD_OID
#define GT_PICKINFO wrsCpuLoad_pickinfo
#define GT_DATA_FILL_FUNC wrsCpuLoad_data_fill
#define GT_DATA_STRUCT wrsCpuLoad_s
#define GT_GROUP_NAME "wrsCpuLoadGroup"
#define GT_INIT_FUNC init_wrsCpuLoadGroup
#include "wrsGroupTemplate.h"
#ifndef WRS_CPU_LOAD_GROUP_H
#define WRS_CPU_LOAD_GROUP_H
#define WRSCPULOAD_CACHE_TIMEOUT 5
#define WRSCPULOAD_OID WRS_OID, 7, 1, 5
struct wrsCpuLoad_s {
int wrsCPULoadAvg1min;
int wrsCPULoadAvg5min;
int wrsCPULoadAvg15min;
};
extern struct wrsCpuLoad_s wrsCpuLoad_s;
time_t wrsCpuLoad_data_fill(void);
void init_wrsCpuLoadGroup(void);
#endif /* WRS_CPU_LOAD_GROUP_H */
#include "wrsSnmp.h"
#include "snmp_shmem.h"
#include "wrsDiskTable.h"
#define DISKUSAGE_COMMAND "/bin/df -P"
struct wrsDiskTable_s wrsDiskTable_array[WRS_MAX_N_DISKS];
static struct pickinfo wrsDiskTable_pickinfo[] = {
/* Warning: strings are a special case for snmp format */
FIELD(wrsDiskTable_s, ASN_UNSIGNED, wrsDiskIndex), /* not reported */
FIELD(wrsDiskTable_s, ASN_OCTET_STR, wrsDiskMountPath),
FIELD(wrsDiskTable_s, ASN_INTEGER, wrsDiskSize),
FIELD(wrsDiskTable_s, ASN_INTEGER, wrsDiskUsed),
FIELD(wrsDiskTable_s, ASN_INTEGER, wrsDiskFree),
FIELD(wrsDiskTable_s, ASN_INTEGER, wrsDiskUseRate),
FIELD(wrsDiskTable_s, ASN_OCTET_STR, wrsDiskFilesystem),
};
static int32_t int_saturate(int64_t value)
{
if (value >= INT32_MAX)
return INT32_MAX;
else if (value <= INT32_MIN)
return INT32_MIN;
return value;
}
time_t wrsDiskTable_data_fill(unsigned int *ret_n_rows)
{
static time_t time_update;
time_t time_cur;
FILE *f;
char filesystem[64];
uint64_t disk_size;
uint64_t disk_used;
uint64_t disk_available;
char mount_path[32];
char s[80];
static int n_rows;
/* number of rows depends on numbef or mounted disks */
if (ret_n_rows)
*ret_n_rows = n_rows;
time_cur = time(NULL);
if (time_update
&& time_cur - time_update < WRSDISKTABLE_CACHE_TIMEOUT) {
/* cache not updated, return last update time */
return time_update;
}
time_update = time_cur;
memset(&wrsDiskTable_array, 0, sizeof(wrsDiskTable_array));
f = popen(DISKUSAGE_COMMAND, "r");
if (!f) {
snmp_log(LOG_ERR, "SNMP: wrsDiskTable filed to execute "
DISKUSAGE_COMMAND"\n");
return time_cur;
}
/* skip first line with columns' descriptions */
fgets(s, sizeof(s), f);
n_rows = 0;
while (fgets(s, sizeof(s), f)) {
if (n_rows > WRS_MAX_N_DISKS) {
n_rows = WRS_MAX_N_DISKS;
break;
}
if (5 != sscanf(s, "%s %llu %llu %llu %*s %s %*[^\n]",
filesystem, &disk_size, &disk_used,
&disk_available, mount_path))
continue; /* error while reading df's output */
strncpy(wrsDiskTable_array[n_rows].wrsDiskFilesystem,
filesystem, 64);
wrsDiskTable_array[n_rows].wrsDiskSize =
int_saturate(disk_size);
wrsDiskTable_array[n_rows].wrsDiskUsed =
int_saturate(disk_used);
wrsDiskTable_array[n_rows].wrsDiskFree =
int_saturate(disk_available);
wrsDiskTable_array[n_rows].wrsDiskUseRate =
(wrsDiskTable_array[n_rows].wrsDiskUsed * 100)
/wrsDiskTable_array[n_rows].wrsDiskSize;
strncpy(wrsDiskTable_array[n_rows].wrsDiskMountPath,
mount_path, 32);
n_rows++;
}
pclose(f);
if (ret_n_rows)
*ret_n_rows = n_rows;
/* there was an update, return current time */
return time_update;
}
#define TT_OID WRSDISKTABLE_OID
#define TT_PICKINFO wrsDiskTable_pickinfo
#define TT_DATA_FILL_FUNC wrsDiskTable_data_fill
#define TT_DATA_ARRAY wrsDiskTable_array
#define TT_GROUP_NAME "wrsDiskTable"
#define TT_INIT_FUNC init_wrsDiskTable
#define TT_CACHE_TIMEOUT WRSDISKTABLE_CACHE_TIMEOUT
#include "wrsTableTemplate.h"
#ifndef WRS_DISK_TABLE_H
#define WRS_DISK_TABLE_H
#define WRSDISKTABLE_CACHE_TIMEOUT 5
#define WRSDISKTABLE_OID WRS_OID, 7, 1, 6
#define WRS_MAX_N_DISKS 10
struct wrsDiskTable_s {
uint32_t wrsDiskIndex; /* not reported, index fields has to be marked
* as not-accessible in MIB */
char wrsDiskMountPath[32];
uint32_t wrsDiskSize;
uint32_t wrsDiskUsed;
uint32_t wrsDiskFree;
uint32_t wrsDiskUseRate;
char wrsDiskFilesystem[64];
};
extern struct wrsDiskTable_s wrsDiskTable_array[WRS_MAX_N_DISKS];
time_t wrsDiskTable_data_fill(unsigned int *rows);
void init_wrsDiskTable(void);
#endif /* WRS_DISK_TABLE_H */
#include "wrsSnmp.h"
#include "wrsOSStatusGroup.h"
#include "wrsTimingStatusGroup.h"
#include "wrsNetworkingStatusGroup.h"
#include "wrsGeneralStatusGroup.h"
......@@ -16,16 +17,21 @@ 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_timing_status; /* time when wrsTimingStatus data was
* updated */
time_t time_networking_status; /* time when wrsNetworkingStatus data
* was updated */
struct wrsOSStatus_s *o;
struct wrsTimingStatus_s *t;
struct wrsNetworkingStatus_s *n;
struct wrsGeneralStatus_s *g;
time_osstatus = wrsOSStatus_data_fill();
time_timing_status = wrsTimingStatus_data_fill();
time_networking_status = wrsNetworkingStatus_data_fill();
if (time_osstatus <= time_update
&& time_timing_status <= time_update
&& time_networking_status <= time_update) {
/* cache not updated, return last update time */
snmp_log(LOG_ERR,
......@@ -41,6 +47,9 @@ time_t wrsGeneralStatus_data_fill(void)
o = &wrsOSStatus_s;
if ( /* check if error */
o->wrsBootSuccessful == WRS_BOOT_SUCCESSFUL_ERROR
|| o->wrsMemoryFreeLow == WRS_MEMORY_FREE_LOW_ERROR
|| o->wrsCpuLoadHigh == WRS_CPU_LOAD_HIGH_ERROR
|| o->wrsDiskSpaceLow == WRS_DISK_SPACE_LOW_ERROR
) {
wrsGeneralStatus_s.wrsOSStatus = WRS_OS_STATUS_ERROR;
......@@ -48,6 +57,9 @@ time_t wrsGeneralStatus_data_fill(void)
o->wrsBootSuccessful == WRS_BOOT_SUCCESSFUL_WARNING
|| o->wrsTemperatureWarning == WRS_TEMPERATURE_WARNING_THOLD_NOT_SET
|| o->wrsTemperatureWarning == WRS_TEMPERATURE_WARNING_TOO_HIGH
|| o->wrsMemoryFreeLow == WRS_MEMORY_FREE_LOW_WARNING
|| o->wrsCpuLoadHigh == WRS_CPU_LOAD_HIGH_WARNING
|| o->wrsDiskSpaceLow == WRS_DISK_SPACE_LOW_WARNING
) { /* warning */
wrsGeneralStatus_s.wrsOSStatus = WRS_OS_STATUS_WARNING;
......@@ -55,12 +67,20 @@ time_t wrsGeneralStatus_data_fill(void)
o->wrsBootSuccessful == WRS_BOOT_SUCCESSFUL_WARNING_NA
|| o->wrsBootSuccessful == 0
|| o->wrsTemperatureWarning == 0
|| o->wrsMemoryFreeLow == WRS_MEMORY_FREE_LOW_WARNING_NA
|| o->wrsMemoryFreeLow == 0
|| o->wrsCpuLoadHigh == 0
|| o->wrsDiskSpaceLow == WRS_DISK_SPACE_LOW_WARNING_NA
|| o->wrsDiskSpaceLow == 0
) { /* warning NA */
wrsGeneralStatus_s.wrsOSStatus = WRS_OS_STATUS_WARNING_NA;
} else if ( /* check if OK */
o->wrsBootSuccessful == WRS_BOOT_SUCCESSFUL_OK
&& o->wrsTemperatureWarning == WRS_TEMPERATURE_WARNING_OK
&& o->wrsMemoryFreeLow == WRS_MEMORY_FREE_LOW_OK
&& o->wrsCpuLoadHigh == WRS_CPU_LOAD_HIGH_OK
&& o->wrsDiskSpaceLow == WRS_DISK_SPACE_LOW_OK
) { /* OK */
wrsGeneralStatus_s.wrsOSStatus = WRS_OS_STATUS_OK;
......@@ -73,8 +93,50 @@ time_t wrsGeneralStatus_data_fill(void)
|************************** wrsTimingStatus **************************|
\*********************************************************************/
/* not implemented, always return OK */
wrsGeneralStatus_s.wrsTimingStatus = WRS_TIMING_STATUS_OK;
t = &wrsTimingStatus_s;
if ( /* check if error */
t->wrsPTPStatus == WRS_PTP_STATUS_ERROR
|| t->wrsSoftPLLStatus == WRS_SOFTPLL_STATUS_ERROR
|| t->wrsSlaveLinksStatus == WRS_SLAVE_LINK_STATUS_ERROR
|| t->wrsPTPFramesFlowing == WRS_PTP_FRAMES_FLOWING_ERROR
) {
wrsGeneralStatus_s.wrsTimingStatus =
WRS_TIMING_STATUS_ERROR;
} else if ( /* check if warning */
t->wrsSoftPLLStatus == WRS_SOFTPLL_STATUS_WARNING
) { /* warning */
wrsGeneralStatus_s.wrsTimingStatus =
WRS_TIMING_STATUS_WARNING;
} else if ( /* check if any of fields equal to 0 or WARNING_NA */
t->wrsPTPStatus == 0
|| t->wrsSoftPLLStatus == WRS_SOFTPLL_STATUS_WARNING_NA
|| t->wrsSoftPLLStatus == 0
|| t->wrsSlaveLinksStatus == 0
|| t->wrsSlaveLinksStatus == WRS_SLAVE_LINK_STATUS_WARNING_NA
|| t->wrsPTPFramesFlowing == 0
|| t->wrsPTPFramesFlowing == WRS_PTP_FRAMES_FLOWING_WARNING_NA
) { /* warning NA */
wrsGeneralStatus_s.wrsTimingStatus =
WRS_TIMING_STATUS_WARNING_NA;
} else if ( /* check if OK, FR (first read) is also ok */
(t->wrsPTPStatus == WRS_PTP_STATUS_OK
|| t->wrsPTPStatus == WRS_PTP_STATUS_FR) /* FR*/
&& t->wrsSoftPLLStatus == WRS_SOFTPLL_STATUS_OK
&& t->wrsSlaveLinksStatus == WRS_SLAVE_LINK_STATUS_OK
&& (t->wrsPTPFramesFlowing == WRS_PTP_FRAMES_FLOWING_OK
|| t->wrsPTPFramesFlowing == WRS_PTP_FRAMES_FLOWING_FR) /* FR */
) { /* OK */
wrsGeneralStatus_s.wrsTimingStatus =
WRS_TIMING_STATUS_OK;
} else { /* probably bug in previous conditions,
* this should never happen */
wrsGeneralStatus_s.wrsTimingStatus =
WRS_TIMING_STATUS_BUG;
}
/*********************************************************************\
|************************ wrsNetworkingStatus ************************|
......
#include "wrsSnmp.h"
#include "wrsMemoryGroup.h"
#define MEMINFO_FILE "/proc/meminfo"
#define MEMINFO_ENTRIES 4 /* How many meminfo are interesting for us, used to
* speed up reading meminfo file */
static struct pickinfo wrsMemory_pickinfo[] = {
FIELD(wrsMemory_s, ASN_INTEGER, wrsMemoryTotal),
FIELD(wrsMemory_s, ASN_INTEGER, wrsMemoryUsed),
FIELD(wrsMemory_s, ASN_INTEGER, wrsMemoryUsedPerc),
FIELD(wrsMemory_s, ASN_INTEGER, wrsMemoryFree),
};
struct wrsMemory_s wrsMemory_s;
time_t wrsMemory_data_fill(void)
{
static time_t time_update;
time_t time_cur;
unsigned long value;
unsigned long mem_total = 0;
unsigned long mem_free = 0;
unsigned long mem_cached = 0;
unsigned long mem_buffers = 0;
int found = 0;
FILE *f;
int ret = 0;
char key[41]; /* 1 for null char */
time_cur = time(NULL);
if (time_update
&& time_cur - time_update < WRSMEMORY_CACHE_TIMEOUT) {
/* cache not updated, return last update time */
return time_update;
}
time_update = time_cur;
memset(&wrsMemory_s, 0, sizeof(wrsMemory_s));
f = fopen(MEMINFO_FILE, "r");
if (!f) {
snmp_log(LOG_ERR, "SNMP: wrsMemoryGroup filed to open "
MEMINFO_FILE"\n");
/* notify snmp about error in kernel modules */
return time_update;
}
while (ret != EOF && found < MEMINFO_ENTRIES) {
/* read first word from line (module name) ignore rest of
* the line */
ret = fscanf(f, "%40s %lu %*[^\n]", key, &value);
if (ret != 2)
continue; /* error... or EOF */
if (!strcmp(key, "MemTotal:")) {
mem_total = value;
found++;
} else if (!strcmp(key, "MemFree:")) {
mem_free = value;
found++;
} else if (!strcmp(key, "Buffers:")) {
mem_buffers = value;
found++;
} else if (!strcmp(key, "Cached:")) {
mem_cached = value;
found++;
}
}
if (found == MEMINFO_ENTRIES && mem_total > 0) { /* avoid div 0 */
wrsMemory_s.wrsMemoryTotal = (int) mem_total;
wrsMemory_s.wrsMemoryUsed = (int) (mem_total - mem_free
- mem_buffers - mem_cached);
wrsMemory_s.wrsMemoryUsedPerc = (int) ((mem_total - mem_free
- mem_buffers - mem_cached)
* 100 / mem_total);
wrsMemory_s.wrsMemoryFree = (int) (mem_free + mem_buffers
+ mem_cached);
} else { /* if not enough entries found */
snmp_log(LOG_ERR, "SNMP: wrsMemoryGroup error while reading "
"values from "MEMINFO_FILE"\n");
}
/* there was an update, return current time */
return time_update;
}
#define GT_OID WRSMEMORY_OID
#define GT_PICKINFO wrsMemory_pickinfo
#define GT_DATA_FILL_FUNC wrsMemory_data_fill
#define GT_DATA_STRUCT wrsMemory_s
#define GT_GROUP_NAME "wrsMemoryGroup"
#define GT_INIT_FUNC init_wrsMemoryGroup
#include "wrsGroupTemplate.h"
#ifndef WRS_MEMORY_GROUP_H
#define WRS_MEMORY_GROUP_H
#define WRSMEMORY_CACHE_TIMEOUT 5
#define WRSMEMORY_OID WRS_OID, 7, 1, 4
struct wrsMemory_s {
int wrsMemoryTotal;
int wrsMemoryUsed;
int wrsMemoryUsedPerc;
int wrsMemoryFree;
};
extern struct wrsMemory_s wrsMemory_s;
time_t wrsMemory_data_fill(void);
void init_wrsMemoryGroup(void);
#endif /* WRS_MEMORY_GROUP_H */
......@@ -13,17 +13,17 @@
* normal operation */
#define WRS_SFPS_STATUS_BUG 5 /* warning */
#define WRS_ENDPOINT_STATUS_FR 1 /* ok, first read */
#define WRS_ENDPOINT_STATUS_OK 2 /* ok */
#define WRS_ENDPOINT_STATUS_ERROR 3 /* error */
#define WRS_ENDPOINT_STATUS_OK 1 /* ok */
#define WRS_ENDPOINT_STATUS_ERROR 2 /* error */
#define WRS_ENDPOINT_STATUS_FR 6 /* ok, first read */
#define WRS_SWCORE_STATUS_FR 1 /* ok, first read */
#define WRS_SWCORE_STATUS_OK 2 /* ok */
#define WRS_SWCORE_STATUS_ERROR 3 /* error */
#define WRS_SWCORE_STATUS_OK 1 /* ok */
#define WRS_SWCORE_STATUS_ERROR 2 /* error */
#define WRS_SWCORE_STATUS_FR 6 /* ok, first read */
#define WRS_RTU_STATUS_FR 1 /* ok, first read */
#define WRS_RTU_STATUS_OK 2 /* ok */
#define WRS_RTU_STATUS_ERROR 3 /* error */
#define WRS_RTU_STATUS_OK 1 /* ok */
#define WRS_RTU_STATUS_ERROR 2 /* error */
#define WRS_RTU_STATUS_FR 6 /* ok, first read */
struct wrsNetworkingStatus_s {
int wrsSFPsStatus;
......
#include "wrsSnmp.h"
#include "wrsBootStatusGroup.h"
#include "wrsTemperatureGroup.h"
#include "wrsMemoryGroup.h"
#include "wrsCpuLoadGroup.h"
#include "wrsDiskTable.h"
#include "wrsOSStatusGroup.h"
#define WRSMEMORYFREELOW_TRESHOLD_ERROR 80
#define WRSMEMORYFREELOW_TRESHOLD_WARNING 50
/* To avoid float values for cpu load, they are multiplied by 100 */
#define WRSCPULOAD_1MIN_WARNING 200
#define WRSCPULOAD_5MIN_WARNING 150
#define WRSCPULOAD_15MIN_WARNING 100
#define WRSCPULOAD_1MIN_ERROR 300
#define WRSCPULOAD_5MIN_ERROR 200
#define WRSCPULOAD_15MIN_ERROR 150
#define WRSDISKSPACELOW_TRESHOLD_ERROR 90
#define WRSDISKSPACELOW_TRESHOLD_WARNING 80
static struct pickinfo wrsOSStatus_pickinfo[] = {
FIELD(wrsOSStatus_s, ASN_INTEGER, wrsBootSuccessful),
FIELD(wrsOSStatus_s, ASN_INTEGER, wrsTemperatureWarning),
FIELD(wrsOSStatus_s, ASN_INTEGER, wrsMemoryFreeLow),
FIELD(wrsOSStatus_s, ASN_INTEGER, wrsCpuLoadHigh),
FIELD(wrsOSStatus_s, ASN_INTEGER, wrsDiskSpaceLow),
};
struct wrsOSStatus_s wrsOSStatus_s;
......@@ -15,13 +35,28 @@ time_t wrsOSStatus_data_fill(void)
static time_t time_update; /* time of last update */
time_t time_temp; /* time when temperature data was updated */
time_t time_boot; /* time when boot data was updated */
time_t time_free_mem; /* time when free memory data was updated */
time_t time_cpu_load; /* time when cpu load data was updated */
time_t time_disk_space; /* time when disk space data was updated */
unsigned int n_rows_disk_space; /* number of rows in wrsDiskTable_array
*/
unsigned int i;
struct wrsBootStatus_s *b;
struct wrsMemory_s *f;
struct wrsCpuLoad_s *c;
struct wrsDiskTable_s *d;
time_boot = wrsBootStatus_data_fill();
time_temp = wrsTemperature_data_fill();
time_free_mem = wrsMemory_data_fill();
time_cpu_load = wrsCpuLoad_data_fill();
time_disk_space = wrsDiskTable_data_fill(&n_rows_disk_space);
if (time_boot <= time_update
&& time_temp <= time_update) {
&& time_temp <= time_update
&& time_free_mem <= time_update
&& time_cpu_load <= time_update
&& time_disk_space <= time_update) {
/* cache not updated, return last update time */
return time_update;
}
......@@ -127,6 +162,76 @@ time_t wrsOSStatus_data_fill(void)
|| (wrsTemperature_s.temp_psr > wrsTemperature_s.temp_psr_thold));
}
/*********************************************************************\
|************************* wrsMemoryFreeLow *************************|
\*********************************************************************/
/* Check memory usage */
f = &wrsMemory_s;
if (f->wrsMemoryUsedPerc > WRSMEMORYFREELOW_TRESHOLD_ERROR) {
/* Memory usage above error threshold level */
wrsOSStatus_s.wrsMemoryFreeLow = WRS_MEMORY_FREE_LOW_ERROR;
} else if (f->wrsMemoryUsedPerc > WRSMEMORYFREELOW_TRESHOLD_WARNING) {
/* Memory usage above warning threshold level */
wrsOSStatus_s.wrsMemoryFreeLow = WRS_MEMORY_FREE_LOW_WARNING;
} else if (f->wrsMemoryTotal == 0) {
/* Problem with read memory size */
wrsOSStatus_s.wrsMemoryFreeLow =
WRS_MEMORY_FREE_LOW_WARNING_NA;
} else {
/* Memory usage below threshold levels */
wrsOSStatus_s.wrsMemoryFreeLow = WRS_MEMORY_FREE_LOW_OK;
}
/*********************************************************************\
|************************** wrsCpuLoadHigh **************************|
\*********************************************************************/
/* Check CPU load */
c = &wrsCpuLoad_s;
if (c->wrsCPULoadAvg1min > WRSCPULOAD_1MIN_ERROR
|| c->wrsCPULoadAvg5min > WRSCPULOAD_5MIN_ERROR
|| c->wrsCPULoadAvg15min > WRSCPULOAD_15MIN_ERROR) {
/* CPU load above error threshold level */
wrsOSStatus_s.wrsCpuLoadHigh = WRS_CPU_LOAD_HIGH_ERROR;
} else if (c->wrsCPULoadAvg1min > WRSCPULOAD_1MIN_WARNING
|| c->wrsCPULoadAvg5min > WRSCPULOAD_5MIN_WARNING
|| c->wrsCPULoadAvg15min > WRSCPULOAD_15MIN_WARNING) {
/* CPU load above warning threshold level */
wrsOSStatus_s.wrsCpuLoadHigh = WRS_CPU_LOAD_HIGH_WARNING;
} else {
/* CPU load below threshold levels */
wrsOSStatus_s.wrsCpuLoadHigh = WRS_CPU_LOAD_HIGH_OK;
}
/*********************************************************************\
|************************** wrsDiskSpaceLow **************************|
\*********************************************************************/
/* Check disk usage */
d = wrsDiskTable_array;
wrsOSStatus_s.wrsDiskSpaceLow = WRS_DISK_SPACE_LOW_OK;
for (i = 0; i < n_rows_disk_space; i++) {
if (d[i].wrsDiskUseRate > WRSDISKSPACELOW_TRESHOLD_ERROR) {
/* Disk usage above error threshold level */
wrsOSStatus_s.wrsDiskSpaceLow =
WRS_DISK_SPACE_LOW_ERROR;
snmp_log(LOG_ERR, "SNMP: wrsDiskSpaceLow error for "
"disk %s\n", d[i].wrsDiskMountPath);
/* error, can't be worst so break */
break;
} else if (d[i].wrsDiskUseRate > WRSDISKSPACELOW_TRESHOLD_WARNING) {
/* Disk usage above warning threshold level */
wrsOSStatus_s.wrsDiskSpaceLow =
WRS_DISK_SPACE_LOW_WARNING;
snmp_log(LOG_ERR, "SNMP: wrsDiskSpaceLow warning for "
"disk %s\n", d[i].wrsDiskMountPath);
} else if (d[i].wrsDiskSize == 0
&& wrsOSStatus_s.wrsDiskSpaceLow == WRS_DISK_SPACE_LOW_OK) {
/* disk size is 0, propably error while reading size,
* but don't overwrite regular warning */
wrsOSStatus_s.wrsDiskSpaceLow =
WRS_DISK_SPACE_LOW_WARNING_NA;
}
}
/* there was an update, return current time */
return time_update;
}
......
......@@ -15,9 +15,30 @@
#define WRS_TEMPERATURE_WARNING_OK 2 /* ok */
#define WRS_TEMPERATURE_WARNING_TOO_HIGH 3 /* warning */
#define WRS_MEMORY_FREE_LOW_OK 1 /* ok */
#define WRS_MEMORY_FREE_LOW_ERROR 2 /* error */
#define WRS_MEMORY_FREE_LOW_WARNING 3 /* warning */
#define WRS_MEMORY_FREE_LOW_WARNING_NA 4 /* warning, at least one field is
* equal to 0 (NA),shouldn't happen in
* normal operation */
#define WRS_CPU_LOAD_HIGH_OK 1 /* ok */
#define WRS_CPU_LOAD_HIGH_ERROR 2 /* error */
#define WRS_CPU_LOAD_HIGH_WARNING 3 /* warning */
#define WRS_DISK_SPACE_LOW_OK 1 /* ok */
#define WRS_DISK_SPACE_LOW_ERROR 2 /* error */
#define WRS_DISK_SPACE_LOW_WARNING 3 /* warning */
#define WRS_DISK_SPACE_LOW_WARNING_NA 4 /* warning, at least one field is
* equal to 0 (NA),shouldn't happen in
* normal operation */
struct wrsOSStatus_s {
int wrsBootSuccessful;
int wrsTemperatureWarning;
int wrsMemoryFreeLow;
int wrsCpuLoadHigh;
int wrsDiskSpaceLow;
};
extern struct wrsOSStatus_s wrsOSStatus_s;
......
......@@ -18,15 +18,18 @@ static struct pickinfo wrsPortStatusTable_pickinfo[] = {
FIELD(wrsPortStatusTable_s, ASN_INTEGER, sfp_in_db),
FIELD(wrsPortStatusTable_s, ASN_INTEGER, sfp_GbE),
FIELD(wrsPortStatusTable_s, ASN_INTEGER, sfp_error),
FIELD(wrsPortStatusTable_s, ASN_COUNTER, ptp_tx_count),
FIELD(wrsPortStatusTable_s, ASN_COUNTER, ptp_rx_count),
};
time_t wrsPortStatusTable_data_fill(unsigned int *n_rows)
{
unsigned ii, i;
unsigned ii, i, ppi_i;
unsigned retries = 0;
static time_t time_update;
time_t time_cur;
char *ppsi_iface_name;
/* number of rows does not change for wrsPortStatusTable */
if (n_rows)
......@@ -55,9 +58,13 @@ time_t wrsPortStatusTable_data_fill(unsigned int *n_rows)
wrsPortStatusTable_array[i].port_name);
/* No need to copy all ports structures, only what
* we're interested in.
* Keep value 0 for Not available */
* Keep value 0 for Not available
* values defined as WRS_PORT_STATUS_LINK_*
*/
wrsPortStatusTable_array[i].link_up =
1 + state_up(port_state->state);
/* values defined as
* WRS_PORT_STATUS_CONFIGURED_MODE_* */
wrsPortStatusTable_array[i].port_mode =
port_state->mode;
if (port_state->state == HAL_PORT_STATE_DISABLED) {
......@@ -116,6 +123,49 @@ time_t wrsPortStatusTable_data_fill(unsigned int *n_rows)
usleep(1000);
}
retries = 0;
/* fill ptp_tx_count and ptp_tx_count
* ptp_tx_count and ptp_tx_count statistics in PPSI are collected per
* ppi instance. Since there can be more than one instance per physical
* port, proper counters has to be added. */
while (1) {
ii = wrs_shm_seqbegin(ppsi_head);
/* Match port name with interface name of ppsi instance.
* More than one ppsi_iface_name can match to
* wrsPortStatusTable_array[i].port_name, but only one can
* match way round */
for (ppi_i = 0; ppi_i < *ppsi_ppi_nlinks; ppi_i++) {
/* (ppsi_ppi + ppi_i)->iface_name is a pointer in
* shmem, so we have to follow it
* NOTE: ppi->cfg.port_name cannot be used instead,
* because it is not used when ppsi is configured from
* cmdline */
ppsi_iface_name = (char *) wrs_shm_follow(ppsi_head,
(ppsi_ppi + ppi_i)->iface_name);
for (i = 0; i < hal_nports_local; ++i) {
if (!strncmp(wrsPortStatusTable_array[i].port_name,
ppsi_iface_name, 12)) {
wrsPortStatusTable_array[i].ptp_tx_count +=
(ppsi_ppi + ppi_i)->ptp_tx_count;
wrsPortStatusTable_array[i].ptp_rx_count +=
(ppsi_ppi + ppi_i)->ptp_rx_count;
/* speed up a little, break here */
break;
}
}
}
retries++;
if (retries > 100) {
snmp_log(LOG_ERR, "%s: too many retries to read PPSI "
"shmem\n", __func__);
retries = 0;
break;
}
if (!wrs_shm_seqretry(ppsi_head, ii))
break; /* consistent read */
usleep(1000);
}
/* there was an update, return current time */
return time_cur;
}
......
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