Add an ability of pmc to query per-port stats added in the previous patch.

Signed-off-by: Petr Machata <pe...@mellanox.com>
---
 pmc.c        | 47 +++++++++++++++++++++++++++++++++++++++++++++++
 pmc_common.c |  1 +
 port.c       |  7 +++++++
 tlv.c        | 15 +++++++++++++++
 tlv.h        |  6 ++++++
 5 files changed, 76 insertions(+)

diff --git a/pmc.c b/pmc.c
index 440c905..868fc2a 100644
--- a/pmc.c
+++ b/pmc.c
@@ -69,6 +69,7 @@ static void pmc_show(struct ptp_message *msg, FILE *fp)
        struct tlv_extra *extra;
        struct portDS *p;
        struct port_ds_np *pnp;
+       struct port_stats_np *pcp;
 
        if (msg_type(msg) != MANAGEMENT) {
                return;
@@ -322,6 +323,52 @@ static void pmc_show(struct ptp_message *msg, FILE *fp)
                        pnp->neighborPropDelayThresh,
                        pnp->asCapable ? 1 : 0);
                break;
+       case TLV_PORT_STATS_NP:
+               pcp = (struct port_stats_np *) mgt->data;
+               fprintf(fp, "PORT_STATS_NP "
+                       IFMT "portIdentity              %s"
+                       IFMT "rx_Sync                   %" PRIu64
+                       IFMT "rx_Delay_Req              %" PRIu64
+                       IFMT "rx_Pdelay_Req             %" PRIu64
+                       IFMT "rx_Pdelay_Resp            %" PRIu64
+                       IFMT "rx_Follow_Up              %" PRIu64
+                       IFMT "rx_Delay_Resp             %" PRIu64
+                       IFMT "rx_Pdelay_Resp_Follow_Up  %" PRIu64
+                       IFMT "rx_Announce               %" PRIu64
+                       IFMT "rx_Signaling              %" PRIu64
+                       IFMT "rx_Management             %" PRIu64
+                       IFMT "tx_Sync                   %" PRIu64
+                       IFMT "tx_Delay_Req              %" PRIu64
+                       IFMT "tx_Pdelay_Req             %" PRIu64
+                       IFMT "tx_Pdelay_Resp            %" PRIu64
+                       IFMT "tx_Follow_Up              %" PRIu64
+                       IFMT "tx_Delay_Resp             %" PRIu64
+                       IFMT "tx_Pdelay_Resp_Follow_Up  %" PRIu64
+                       IFMT "tx_Announce               %" PRIu64
+                       IFMT "tx_Signaling              %" PRIu64
+                       IFMT "tx_Management             %" 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]);
+               break;
        case TLV_LOG_ANNOUNCE_INTERVAL:
                mtd = (struct management_tlv_datum *) mgt->data;
                fprintf(fp, "LOG_ANNOUNCE_INTERVAL "
diff --git a/pmc_common.c b/pmc_common.c
index 4d48e3a..592cc93 100644
--- a/pmc_common.c
+++ b/pmc_common.c
@@ -120,6 +120,7 @@ struct management_id idtab[] = {
        { "DELAY_MECHANISM", TLV_DELAY_MECHANISM, do_get_action },
        { "LOG_MIN_PDELAY_REQ_INTERVAL", TLV_LOG_MIN_PDELAY_REQ_INTERVAL, 
do_get_action },
        { "PORT_DATA_SET_NP", TLV_PORT_DATA_SET_NP, do_set_action },
+       { "PORT_STATS_NP", TLV_PORT_STATS_NP, do_get_action },
 };
 
 static void do_get_action(struct pmc *pmc, int action, int index, char *str)
diff --git a/port.c b/port.c
index 471e6f4..07ad3f0 100644
--- a/port.c
+++ b/port.c
@@ -788,6 +788,7 @@ static int port_management_fill_response(struct port 
*target,
        struct management_tlv_datum *mtd;
        struct clock_description *desc;
        struct port_properties_np *ppn;
+       struct port_stats_np *psn;
        struct management_tlv *tlv;
        struct port_ds_np *pdsnp;
        struct tlv_extra *extra;
@@ -943,6 +944,12 @@ static int port_management_fill_response(struct port 
*target,
                ptp_text_set(&ppn->interface, target->iface->ts_label);
                datalen = sizeof(*ppn) + ppn->interface.length;
                break;
+       case TLV_PORT_STATS_NP:
+               psn = (struct port_stats_np *)tlv->data;
+               psn->portIdentity = target->portIdentity;
+               psn->stats = target->stats;
+               datalen = sizeof(*psn);
+               break;
        default:
                /* The caller should *not* respond to this message. */
                tlv_extra_recycle(extra);
diff --git a/tlv.c b/tlv.c
index 6a5387e..2440482 100644
--- a/tlv.c
+++ b/tlv.c
@@ -92,6 +92,7 @@ static int mgt_post_recv(struct management_tlv *m, uint16_t 
data_len,
        struct grandmaster_settings_np *gsn;
        struct subscribe_events_np *sen;
        struct port_properties_np *ppn;
+       struct port_stats_np *psn;
        struct mgmt_clock_description *cd;
        int extra_len = 0, len;
        uint8_t *buf;
@@ -286,6 +287,14 @@ static int mgt_post_recv(struct management_tlv *m, 
uint16_t data_len,
                extra_len = sizeof(struct port_properties_np);
                extra_len += ppn->interface.length;
                break;
+       case TLV_PORT_STATS_NP:
+               if (data_len < sizeof(struct port_stats_np))
+                       goto bad_length;
+               psn = (struct port_stats_np *)m->data;
+               psn->portIdentity.portNumber =
+                       ntohs(psn->portIdentity.portNumber);
+               extra_len = sizeof(struct port_stats_np);
+               break;
        case TLV_SAVE_IN_NON_VOLATILE_STORAGE:
        case TLV_RESET_NON_VOLATILE_STORAGE:
        case TLV_INITIALIZE:
@@ -319,6 +328,7 @@ static void mgt_pre_send(struct management_tlv *m, struct 
tlv_extra *extra)
        struct grandmaster_settings_np *gsn;
        struct subscribe_events_np *sen;
        struct port_properties_np *ppn;
+       struct port_stats_np *psn;
        struct mgmt_clock_description *cd;
        switch (m->id) {
        case TLV_CLOCK_DESCRIPTION:
@@ -391,6 +401,11 @@ static void mgt_pre_send(struct management_tlv *m, struct 
tlv_extra *extra)
                ppn = (struct port_properties_np *)m->data;
                ppn->portIdentity.portNumber = 
htons(ppn->portIdentity.portNumber);
                break;
+       case TLV_PORT_STATS_NP:
+               psn = (struct port_stats_np *)m->data;
+               psn->portIdentity.portNumber =
+                       htons(psn->portIdentity.portNumber);
+               break;
        }
 }
 
diff --git a/tlv.h b/tlv.h
index bcbfdd9..faf5742 100644
--- a/tlv.h
+++ b/tlv.h
@@ -105,6 +105,7 @@ enum management_action {
 #define TLV_LOG_MIN_PDELAY_REQ_INTERVAL                        0x6001
 #define TLV_PORT_DATA_SET_NP                           0xC002
 #define TLV_PORT_PROPERTIES_NP                         0xC004
+#define TLV_PORT_STATS_NP                              0xC005
 
 /* Management error ID values */
 #define TLV_RESPONSE_TOO_BIG                           0x0001
@@ -280,6 +281,11 @@ struct port_properties_np {
        struct PTPText interface;
 } PACKED;
 
+struct port_stats_np {
+       struct PortIdentity portIdentity;
+       struct PortStats stats;
+} PACKED;
+
 #define PROFILE_ID_LEN 6
 
 struct mgmt_clock_description {
-- 
2.20.1



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

Reply via email to