Add struct PortStats to keep per-port number of messages sent and received,
split by message type. Bump TX counters after messages are sent
successfully, and RX counters after a message is received. To keep things
simple, reserve one counter for each theoretically possible message type,
including the reserved ones.

Signed-off-by: Petr Machata <pe...@mellanox.com>
---
 ddt.h          |  5 +++++
 port.c         | 25 +++++++++++++++++++++++--
 port_private.h |  1 +
 3 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/ddt.h b/ddt.h
index 4acaa4f..5486203 100644
--- a/ddt.h
+++ b/ddt.h
@@ -100,4 +100,9 @@ struct FaultRecord {
        struct PTPText   faultDescription;
 };
 
+struct PortStats {
+       uint64_t rxMsgType[16];
+       uint64_t txMsgType[16];
+};
+
 #endif
diff --git a/port.c b/port.c
index 5a4a116..471e6f4 100644
--- a/port.c
+++ b/port.c
@@ -580,6 +580,16 @@ static int path_trace_ignore(struct port *p, struct 
ptp_message *m)
        return 0;
 }
 
+static void port_stats_inc_rx(struct port *p, const struct ptp_message *msg)
+{
+       p->stats.rxMsgType[msg_type(msg)]++;
+}
+
+static void port_stats_inc_tx(struct port *p, const struct ptp_message *msg)
+{
+       p->stats.txMsgType[msg_type(msg)]++;
+}
+
 static int peer_prepare_and_send(struct port *p, struct ptp_message *msg,
                                 enum transport_event event)
 {
@@ -595,6 +605,7 @@ static int peer_prepare_and_send(struct port *p, struct 
ptp_message *msg,
        if (cnt <= 0) {
                return -1;
        }
+       port_stats_inc_tx(p, msg);
        if (msg_sots_valid(msg)) {
                ts_add(&msg->hwts.ts, p->tx_timestamp_offset);
        }
@@ -2627,6 +2638,7 @@ static enum fsm_event bc_event(struct port *p, int 
fd_index)
                msg_put(msg);
                return EV_NONE;
        }
+       port_stats_inc_rx(p, msg);
        if (port_ignore(p, msg)) {
                msg_put(msg);
                return EV_NONE;
@@ -2691,14 +2703,22 @@ int port_forward(struct port *p, struct ptp_message 
*msg)
 {
        int cnt;
        cnt = transport_send(p->trp, &p->fda, TRANS_GENERAL, msg);
-       return cnt <= 0 ? -1 : 0;
+       if (cnt <= 0) {
+               return -1;
+       }
+       port_stats_inc_tx(p, msg);
+       return 0;
 }
 
 int port_forward_to(struct port *p, struct ptp_message *msg)
 {
        int cnt;
        cnt = transport_sendto(p->trp, &p->fda, TRANS_GENERAL, msg);
-       return cnt <= 0 ? -1 : 0;
+       if (cnt <= 0) {
+               return -1;
+       }
+       port_stats_inc_tx(p, msg);
+       return 0;
 }
 
 int port_prepare_and_send(struct port *p, struct ptp_message *msg,
@@ -2717,6 +2737,7 @@ int port_prepare_and_send(struct port *p, struct 
ptp_message *msg,
        if (cnt <= 0) {
                return -1;
        }
+       port_stats_inc_tx(p, msg);
        if (msg_sots_valid(msg)) {
                ts_add(&msg->hwts.ts, p->tx_timestamp_offset);
        }
diff --git a/port_private.h b/port_private.h
index 9a5022d..5789fbb 100644
--- a/port_private.h
+++ b/port_private.h
@@ -139,6 +139,7 @@ struct port {
        struct fault_interval flt_interval_pertype[FT_CNT];
        enum fault_type     last_fault_type;
        unsigned int        versionNumber; /*UInteger4*/
+       struct PortStats    stats;
        /* foreignMasterDS */
        LIST_HEAD(fm, foreign_clock) foreign_masters;
        /* TC book keeping */
-- 
2.20.1



_______________________________________________
Linuxptp-devel mailing list
Linuxptp-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel

Reply via email to