The PORTS_STATS_NP carries RX/TX counters for each Message Type.
The following patch fills the spare slots in order to add the following
counters:
(MSG_TYPES EVENT 0x0...0x3)
RX_BAD_MESSAGE 0x4
RX_BAD_PROTOCOL 0x5
RX_FAIL_RECEIVE 0x6
RX_MISSING_TIMESTAMP 0x7
(MSG_TYPES GENERAL 0x8...0xD)
RX_ANNOUNCE_FOREIGN_MASTER 0xE
RX_ANNOUNCE_CURRENT_MASTER 0xF
(MSG_TYPES EVENT 0x0...0x3)
TX_FAIL_TRANSMIT 0x6
TX_MISSING_TIMESTAMP 0x7
(MSG_TYPES GENERAL 0x8...0xD)
(AVAILABLE 0xE...0xF)
The counters are properly updated by runtime when required.
---
ddt.h | 30 ++++++++++++++++++++++++++++++
pmc.c | 58 +++++++++++++++++++++++++++++++++++++---------------------
port.c | 13 +++++++++++++
3 files changed, 80 insertions(+), 21 deletions(-)
diff --git a/ddt.h b/ddt.h
index 5dc5530..71eec3d 100644
--- a/ddt.h
+++ b/ddt.h
@@ -107,6 +107,36 @@ struct PortStats {
uint64_t txMsgType[MAX_MESSAGE_TYPES];
};
+#define STATS_RX_SYNC 0x0 // As Message Type
+#define STATS_RX_DELAY_REQ 0x1 // As Message Type
+#define STATS_RX_PDELAY_REQ 0x2 // As Message Type
+#define STATS_RX_PDELAY_RESP 0x3 // As Message Type
+#define STATS_RX_BAD_MESSAGE 0x4
+#define STATS_RX_BAD_PROTOCOL 0x5
+#define STATS_RX_FAIL_RECEIVE 0x6
+#define STATS_RX_MISSING_TIMESTAMP 0x7
+#define STATS_RX_FOLLOW_UP 0x8 // As Message Type
+#define STATS_RX_DELAY_RESP 0x9 // As Message Type
+#define STATS_RX_PDELAY_RESP_FOLLOW_UP 0xA // As Message Type
+#define STATS_RX_ANNOUNCE 0xB // As Message Type
+#define STATS_RX_SIGNALING 0xC // As Message Type
+#define STATS_RX_MANAGEMENT 0xD // As Message Type
+#define STATS_RX_ANNOUNCE_FOREIGN_MASTER 0xE
+#define STATS_RX_ANNOUNCE_CURRENT_MASTER 0xF
+
+#define STATS_TX_SYNC 0x0 // As Message Type
+#define STATS_TX_DELAY_REQ 0x1 // As Message Type
+#define STATS_TX_PDELAY_REQ 0x2 // As Message Type
+#define STATS_TX_PDELAY_RESP 0x3 // As Message Type
+#define STATS_TX_FAIL_TRANSMIT 0x6
+#define STATS_TX_MISSING_TIMESTAMP 0x7
+#define STATS_TX_FOLLOW_UP 0x8 // As Message Type
+#define STATS_TX_DELAY_RESP 0x9 // As Message Type
+#define STATS_TX_PDELAY_RESP_FOLLOW_UP 0xA // As Message Type
+#define STATS_TX_ANNOUNCE 0xB // As Message Type
+#define STATS_TX_SIGNALING 0xC // As Message Type
+#define STATS_TX_MANAGEMENT 0xD // As Message Type
+
struct PortServiceStats {
uint64_t announce_timeout;
uint64_t sync_timeout;
diff --git a/pmc.c b/pmc.c
index bc87058..c714196 100644
--- a/pmc.c
+++ b/pmc.c
@@ -521,6 +521,12 @@ static void pmc_show(struct ptp_message *msg, FILE *fp)
IFMT "rx_Announce %" PRIu64
IFMT "rx_Signaling %" PRIu64
IFMT "rx_Management %" PRIu64
+ IFMT "rx_Bad_Message %" PRIu64
+ IFMT "rx_Bad_Protocol %" PRIu64
+ IFMT "rx_Fail %" PRIu64
+ IFMT "rx_Missing_Timestamp %" PRIu64
+ IFMT "rx_Announce_For_Master %" PRIu64
+ IFMT "rx_Announce_Cur_Master %" PRIu64
IFMT "tx_Sync %" PRIu64
IFMT "tx_Delay_Req %" PRIu64
IFMT "tx_Pdelay_Req %" PRIu64
@@ -530,28 +536,38 @@ static void pmc_show(struct ptp_message *msg, FILE *fp)
IFMT "tx_Pdelay_Resp_Follow_Up %" PRIu64
IFMT "tx_Announce %" PRIu64
IFMT "tx_Signaling %" PRIu64
- IFMT "tx_Management %" PRIu64,
+ IFMT "tx_Management %" PRIu64
+ IFMT "tx_Fail %" PRIu64
+ IFMT "tx_Missing_Timestamp %" PRIu64,
pid2str(&pcp->portIdentity),
- pcp->stats.rxMsgType[SYNC],
- pcp->stats.rxMsgType[DELAY_REQ],
- pcp->stats.rxMsgType[PDELAY_REQ],
- pcp->stats.rxMsgType[PDELAY_RESP],
- pcp->stats.rxMsgType[FOLLOW_UP],
- pcp->stats.rxMsgType[DELAY_RESP],
- pcp->stats.rxMsgType[PDELAY_RESP_FOLLOW_UP],
- pcp->stats.rxMsgType[ANNOUNCE],
- pcp->stats.rxMsgType[SIGNALING],
- pcp->stats.rxMsgType[MANAGEMENT],
- pcp->stats.txMsgType[SYNC],
- pcp->stats.txMsgType[DELAY_REQ],
- pcp->stats.txMsgType[PDELAY_REQ],
- pcp->stats.txMsgType[PDELAY_RESP],
- pcp->stats.txMsgType[FOLLOW_UP],
- pcp->stats.txMsgType[DELAY_RESP],
- pcp->stats.txMsgType[PDELAY_RESP_FOLLOW_UP],
- pcp->stats.txMsgType[ANNOUNCE],
- pcp->stats.txMsgType[SIGNALING],
- pcp->stats.txMsgType[MANAGEMENT]);
+ pcp->stats.rxMsgType[STATS_RX_SYNC],
+ pcp->stats.rxMsgType[STATS_RX_DELAY_REQ],
+ pcp->stats.rxMsgType[STATS_RX_PDELAY_REQ],
+ pcp->stats.rxMsgType[STATS_RX_PDELAY_RESP],
+ pcp->stats.rxMsgType[STATS_RX_FOLLOW_UP],
+ pcp->stats.rxMsgType[STATS_RX_DELAY_RESP],
+ pcp->stats.rxMsgType[STATS_RX_PDELAY_RESP_FOLLOW_UP],
+ pcp->stats.rxMsgType[STATS_RX_ANNOUNCE],
+ pcp->stats.rxMsgType[STATS_RX_SIGNALING],
+ pcp->stats.rxMsgType[STATS_RX_MANAGEMENT],
+ pcp->stats.rxMsgType[STATS_RX_BAD_MESSAGE],
+ pcp->stats.rxMsgType[STATS_RX_BAD_PROTOCOL],
+ pcp->stats.rxMsgType[STATS_RX_FAIL_RECEIVE],
+ pcp->stats.rxMsgType[STATS_RX_MISSING_TIMESTAMP],
+ pcp->stats.rxMsgType[STATS_RX_ANNOUNCE_FOREIGN_MASTER],
+ pcp->stats.rxMsgType[STATS_RX_ANNOUNCE_CURRENT_MASTER],
+ pcp->stats.txMsgType[STATS_TX_SYNC],
+ pcp->stats.txMsgType[STATS_TX_DELAY_REQ],
+ pcp->stats.txMsgType[STATS_TX_PDELAY_REQ],
+ pcp->stats.txMsgType[STATS_TX_PDELAY_RESP],
+ pcp->stats.txMsgType[STATS_TX_FOLLOW_UP],
+ pcp->stats.txMsgType[STATS_TX_DELAY_RESP],
+ pcp->stats.txMsgType[STATS_TX_PDELAY_RESP_FOLLOW_UP],
+ pcp->stats.txMsgType[STATS_TX_ANNOUNCE],
+ pcp->stats.txMsgType[STATS_TX_SIGNALING],
+ pcp->stats.txMsgType[STATS_TX_MANAGEMENT],
+ pcp->stats.txMsgType[STATS_TX_FAIL_TRANSMIT],
+ pcp->stats.txMsgType[STATS_TX_MISSING_TIMESTAMP]);
break;
case MID_PORT_SERVICE_STATS_NP:
pssp = (struct port_service_stats_np *) mgt->data;
diff --git a/port.c b/port.c
index 5803cd3..514bd15 100644
--- a/port.c
+++ b/port.c
@@ -381,6 +381,8 @@ static int add_foreign_master(struct port *p, struct
ptp_message *m)
struct ptp_message *tmp;
int broke_threshold = 0, diff = 0;
+ p->stats.rxMsgType[STATS_RX_ANNOUNCE_FOREIGN_MASTER]++;
+
LIST_FOREACH(fc, &p->foreign_masters, list) {
if (msg_source_equal(m, fc)) {
break;
@@ -1558,6 +1560,7 @@ static int port_pdelay_request(struct port *p)
goto out;
}
if (msg_sots_missing(msg)) {
+ p->stats.txMsgType[STATS_TX_MISSING_TIMESTAMP]++;
pr_err("missing timestamp on transmitted peer delay request");
goto out;
}
@@ -1620,6 +1623,7 @@ int port_delay_request(struct port *p)
goto out;
}
if (msg_sots_missing(msg)) {
+ p->stats.txMsgType[STATS_TX_MISSING_TIMESTAMP]++;
pr_err("missing timestamp on transmitted delay request");
goto out;
}
@@ -1759,6 +1763,7 @@ int port_tx_sync(struct port *p, struct address *dst,
uint16_t sequence_id)
if (p->timestamping == TS_ONESTEP || p->timestamping == TS_P2P1STEP) {
goto out;
} else if (msg_sots_missing(msg)) {
+ p->stats.txMsgType[STATS_TX_MISSING_TIMESTAMP]++;
pr_err("missing timestamp on transmitted sync");
err = -1;
goto out;
@@ -2025,6 +2030,8 @@ static int update_current_master(struct port *p, struct
ptp_message *m)
if (!msg_source_equal(m, fc))
return add_foreign_master(p, m);
+ p->stats.rxMsgType[STATS_RX_ANNOUNCE_CURRENT_MASTER]++;
+
if (p->state != PS_PASSIVE) {
tds.currentUtcOffset = m->announce.currentUtcOffset;
tds.flags = m->header.flagField[1];
@@ -2345,6 +2352,7 @@ int process_pdelay_req(struct port *p, struct ptp_message
*m)
if (p->timestamping == TS_P2P1STEP) {
goto out;
} else if (msg_sots_missing(rsp)) {
+ p->stats.txMsgType[STATS_TX_MISSING_TIMESTAMP]++;
pr_err("missing timestamp on transmitted peer delay response");
err = -1;
goto out;
@@ -2957,6 +2965,7 @@ static enum fsm_event bc_event(struct port *p, int
fd_index)
cnt = transport_recv(p->trp, fd, msg);
if (cnt < 0) {
+ p->stats.rxMsgType[STATS_RX_FAIL_RECEIVE]++;
pr_err("%s: recv message failed", p->log_name);
msg_put(msg);
return EV_FAULT_DETECTED;
@@ -2965,9 +2974,11 @@ static enum fsm_event bc_event(struct port *p, int
fd_index)
if (err) {
switch (err) {
case -EBADMSG:
+ p->stats.rxMsgType[STATS_RX_BAD_MESSAGE]++;
pr_err("%s: bad message", p->log_name);
break;
case -EPROTO:
+ p->stats.rxMsgType[STATS_RX_BAD_PROTOCOL]++;
pr_debug("%s: ignoring message", p->log_name);
break;
}
@@ -2983,6 +2994,7 @@ static enum fsm_event bc_event(struct port *p, int
fd_index)
!(p->timestamping == TS_P2P1STEP && msg_type(msg) == PDELAY_REQ)) {
pr_err("%s: received %s without timestamp",
p->log_name, msg_type_string(msg_type(msg)));
+ p->stats.rxMsgType[STATS_RX_MISSING_TIMESTAMP]++;
msg_put(msg);
return EV_NONE;
}
@@ -3076,6 +3088,7 @@ int port_prepare_and_send(struct port *p, struct
ptp_message *msg,
cnt = transport_send(p->trp, &p->fda, event, msg);
}
if (cnt <= 0) {
+ p->stats.txMsgType[STATS_TX_FAIL_TRANSMIT]++;
return -1;
}
port_stats_inc_tx(p, msg);
--
2.41.0
_______________________________________________
Linuxptp-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel