Commit 8ced101b authored by Adam Wujek's avatar Adam Wujek 💬 Committed by Grzegorz Daniluk

userspace/snmp: add implementation of wrsPtpInstanceTable

Signed-off-by: Adam Wujek's avatarAdam Wujek <adam.wujek@cern.ch>
parent 493fe69e
......@@ -51,6 +51,7 @@ SOURCES = \
wrsPstatsHCTable.c \
wrsPtpDataTable.c \
wrsPortStatusTable.c \
wrsPtpInstanceTable.c \
init.c \
MIBS = WR-SWITCH-MIB.txt
......
......@@ -2611,6 +2611,201 @@ wrsPstatsHCNICTXFrames OBJECT-TYPE
DESCRIPTION
"Number of TX frames coming from CPU"
::= { wrsPstatsHCEntry 42 }
-- wrsPtpInstanceTable (.7.8)
wrsPtpInstanceTable OBJECT-TYPE
SYNTAX SEQUENCE OF wrsPtpInstanceEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"Pstats counters for each port"
::= { wrsExpertStatus 8 }
wrsPtpInstanceEntry OBJECT-TYPE
SYNTAX WrsPtpInstanceEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"An entry containing pstats counters"
INDEX { wrsPtpInstanceIndex }
::= { wrsPtpInstanceTable 1 }
WrsPtpInstanceEntry ::=
SEQUENCE {
wrsPtpInstanceIndex Unsigned32,
wrsPtpInstancePort Integer,
wrsPtpInstanceName DisplayString,
wrsPtpInstanceState INTEGER,
wrsPtpInstanceStateNext INTEGER,
wrsPtpInstanceRole INTEGER,
wrsPtpInstanceMechanism INTEGER,
wrsPtpInstanceProto INTEGER
}
wrsPtpInstanceIndex OBJECT-TYPE
SYNTAX Unsigned32
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"Index for wrsPtpInstanceTable"
::= { wrsPtpInstanceEntry 1 }
wrsPtpInstancePort OBJECT-TYPE
SYNTAX Integer
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Port number on which an instance is running"
::= { wrsPtpInstanceEntry 2 }
wrsPtpInstanceName OBJECT-TYPE
SYNTAX DisplayString (SIZE (0..12))
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Port name of port"
::= { wrsPtpInstanceEntry 3 }
wrsPtpInstanceState OBJECT-TYPE
SYNTAX INTEGER {
na(0),
initializing(1),
faulty(2),
disabled(3),
listening(4),
preMaster(5),
master(6),
passive(7),
uncalibrated(8),
slave(9),
wrsPresent(100),
wrsSLock(101),
wrsMLock(102),
wrsLocked(103),
wrsCalibration(104),
wrsCalibrated(105),
wrsRespCalibReq(106),
wrsWrLinkOn(107),
wrPortCalibration0(108),
wrPortCalibration1(109),
wrPortCalibration2(110),
wrPortCalibration3(111),
wrPortCalibration4(112),
wrPortCalibration5(113),
wrPortCalibration6(114),
wrPortCalibration7(115),
wrPortCalibration8(116),
wrsAbscal(117)
}
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Name of instance"
::= { wrsPtpInstanceEntry 4 }
wrsPtpInstanceStateNext OBJECT-TYPE
SYNTAX INTEGER {
na(0),
initializing(1),
faulty(2),
disabled(3),
listening(4),
preMaster(5),
master(6),
passive(7),
uncalibrated(8),
slave(9),
wrsPresent(100),
wrsSLock(101),
wrsMLock(102),
wrsLocked(103),
wrsCalibration(104),
wrsCalibrated(105),
wrsRespCalibReq(106),
wrsWrLinkOn(107),
wrPortCalibration0(108),
wrPortCalibration1(109),
wrPortCalibration2(110),
wrPortCalibration3(111),
wrPortCalibration4(112),
wrPortCalibration5(113),
wrPortCalibration6(114),
wrPortCalibration7(115),
wrPortCalibration8(116),
wrsAbscal(117)
}
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Name of instance"
::= { wrsPtpInstanceEntry 5 }
wrsPtpInstanceRole OBJECT-TYPE
SYNTAX INTEGER {
na(0),
auto(1),
master(2),
slave(3)
}
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Role of instance"
::= { wrsPtpInstanceEntry 6 }
wrsPtpInstanceMechanism OBJECT-TYPE
SYNTAX INTEGER {
na(0),
e2e(1),
p2p(2),
}
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Mechanism used by an instance"
::= { wrsPtpInstanceEntry 7 }
wrsPtpInstanceProto OBJECT-TYPE
SYNTAX INTEGER {
na(0),
raw(1),
udp(2),
vlan(3),
}
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Protocol used by an instance"
::= { wrsPtpInstanceEntry 8 }
wrsPtpInstanceExt OBJECT-TYPE
SYNTAX INTEGER {
na(0),
none(1),
wr(2),
}
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Extension used by an instance"
::= { wrsPtpInstanceEntry 9 }
wrsPtpInstancePeerMac OBJECT-TYPE
SYNTAX PhysAddress
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"VID used by an instance"
::= { wrsPtpInstanceEntry 10 }
wrsPtpInstancePeerVid OBJECT-TYPE
SYNTAX Integer
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"VID used by an instance"
::= { wrsPtpInstanceEntry 11 }
--wrsNetworking
--Configuration
......
......@@ -26,6 +26,7 @@
#include "wrsPtpDataTable.h"
#include "wrsPortStatusTable.h"
#include "wrsPstatsHCTable.h"
#include "wrsPtpInstanceTable.h"
#define DOTCONFIG_FILE "/wr/etc/dot-config"
......@@ -59,6 +60,7 @@ void init_wrsSnmp(void)
init_wrsPtpDataTable();
init_wrsPortStatusTable();
init_wrsPstatsHCTable();
init_wrsPtpInstanceTable();
/* perform first reads, needed to calculate deltas later */
wrsTimingStatus_data_fill();
......
#include "wrsSnmp.h"
#include "snmp_shmem.h"
#include "wrsPtpInstanceTable.h"
struct wrsPtpInstanceTable_s wrsPtpInstanceTable_array[PP_MAX_LINKS];
static struct pickinfo wrsPtpInstanceTable_pickinfo[] = {
/* Warning: strings are a special case for snmp format */
FIELD(wrsPtpInstanceTable_s, ASN_UNSIGNED, wrsPtpInstanceIndex), /* not reported */
FIELD(wrsPtpInstanceTable_s, ASN_INTEGER, wrsPtpInstancePort),
FIELD(wrsPtpInstanceTable_s, ASN_OCTET_STR, wrsPtpInstanceName),
FIELD(wrsPtpInstanceTable_s, ASN_INTEGER, wrsPtpInstanceState),
FIELD(wrsPtpInstanceTable_s, ASN_INTEGER, wrsPtpInstanceStateNext),
FIELD(wrsPtpInstanceTable_s, ASN_INTEGER, wrsPtpInstanceRole),
FIELD(wrsPtpInstanceTable_s, ASN_INTEGER, wrsPtpInstanceMechanism),
FIELD(wrsPtpInstanceTable_s, ASN_INTEGER, wrsPtpInstanceProto),
FIELD(wrsPtpInstanceTable_s, ASN_INTEGER, wrsPtpInstanceExt),
FIELD(wrsPtpInstanceTable_s, ASN_OCTET_STR, wrsPtpInstancePeerMac),
FIELD(wrsPtpInstanceTable_s, ASN_INTEGER, wrsPtpInstancePeerVid),
};
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 wrsPtpInstanceTable_data_fill(unsigned int *n_rows)
{
unsigned ii, i;
unsigned retries = 0;
static time_t time_update;
time_t time_cur;
static int n_rows_local = 0;
struct wrsPtpInstanceTable_s *i_a;
struct pp_instance *ppsi_i;
char *ppsi_iface_name;
/* number of rows does not change for wrsPortStatusTable */
if (n_rows)
*n_rows = n_rows_local;
time_cur = get_monotonic_sec();
if (time_update
&& time_cur - time_update < WRSPTPINSTANCETABLE_CACHE_TIMEOUT) {
/* cache not updated, return last update time */
return time_update;
}
time_update = time_cur;
memset(&wrsPtpInstanceTable_array, 0, sizeof(wrsPtpInstanceTable_array));
i_a = wrsPtpInstanceTable_array;
/* check whether shmem is available */
if (!shmem_ready_ppsi() && !ppsi_ppi_nlinks) {
snmp_log(LOG_ERR, "%s: Unable to read PPSI's shmem\n", __func__);
/* If set to 0 all PPSI related OIDs disappear */
n_rows_local = 0;
return time_update;
} else {
n_rows_local = *ppsi_ppi_nlinks;
}
if (n_rows)
*n_rows = n_rows_local;
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].wrsPortStatusPortName, but only one can
* match way round */
for (i = 0; i < *ppsi_ppi_nlinks; i++) {
ppsi_i = ppsi_ppi + i;
/* (ppsi_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 */
i_a[i].wrsPtpInstancePort = ppsi_i->port_idx + 1;
ppsi_iface_name = (char *) wrs_shm_follow(ppsi_head,
ppsi_i->port_name);
strncpy(i_a[i].wrsPtpInstanceName, ppsi_iface_name, 12);
i_a[i].wrsPtpInstanceName[11] = '\0';
i_a[i].wrsPtpInstanceState = ppsi_i->state;
i_a[i].wrsPtpInstanceStateNext = ppsi_i->next_state;
i_a[i].wrsPtpInstanceRole = ppsi_i->role + 1;
i_a[i].wrsPtpInstanceMechanism = ppsi_i->mech + 1;
i_a[i].wrsPtpInstanceProto = ppsi_i->proto + 1;
i_a[i].wrsPtpInstanceExt = ppsi_i->cfg.ext + 1;
memcpy(i_a[i].wrsPtpInstancePeerMac, ppsi_i->peer, ETH_ALEN);
i_a[i].wrsPtpInstancePeerVid = ppsi_i->peer_vid;
}
retries++;
if (retries > 100) {
snmp_log(LOG_ERR, "%s: Unable to read PPSI, too many retries\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;
}
#define TT_OID WRSPTPINSTANCETABLE_OID
#define TT_PICKINFO wrsPtpInstanceTable_pickinfo
#define TT_DATA_FILL_FUNC wrsPtpInstanceTable_data_fill
#define TT_DATA_ARRAY wrsPtpInstanceTable_array
#define TT_GROUP_NAME "wrsPtpInstanceTable"
#define TT_INIT_FUNC init_wrsPtpInstanceTable
#define TT_CACHE_TIMEOUT WRSPTPINSTANCETABLE_CACHE_TIMEOUT
#include "wrsTableTemplate.h"
#ifndef WRS_PTP_INSTANCE_TABLE_H
#define WRS_PTP_INSTANCE_TABLE_H
#define WRSPTPINSTANCETABLE_CACHE_TIMEOUT 5
#define WRSPTPINSTANCETABLE_OID WRS_OID, 7, 8
struct wrsPtpInstanceTable_s {
uint32_t wrsPtpInstanceIndex; /* not reported, index fields has t o be marked
* as not-accessible in MIB */
int wrsPtpInstancePort; /* port on which ptp instance is running (index+1) */
char wrsPtpInstanceName[12]; /* port name on which ptp instance is
* running */
int wrsPtpInstanceState;
int wrsPtpInstanceStateNext;
int wrsPtpInstanceRole;
int wrsPtpInstanceMechanism;
int wrsPtpInstanceProto;
int wrsPtpInstanceExt;
char wrsPtpInstancePeerMac[ETH_ALEN];
int wrsPtpInstancePeerVid;
/* vlans: */
/* Number of VLANs nvlans*/
/* List (Table?) of VLANs? */
/* flags? */
};
extern struct wrsPtpInstanceTable_s wrsPtpInstanceTable_array[PP_MAX_LINKS];
time_t wrsPtpInstanceTable_data_fill(unsigned int *rows);
void init_wrsPtpInstanceTable(void);
#endif /* WRS_PTP_INSTANCE_TABLE_H */
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