Re: [Linuxptp-devel] [PATCH 2/2] Ensure TLV_PORT_STATS_NP statistics uses little endian
On Thu, Mar 11, 2021 at 01:02:36PM +0100, Erez Geva wrote: > @@ -469,26 +480,26 @@ static void pmc_show(struct ptp_message *msg, FILE *fp) > IFMT "tx_Signaling %" PRIu64 > IFMT "tx_Management %" PRIu64, > pid2str(>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]); > + getStat(pcp, true, SYNC), All of the code for converting from network to host byte order lives in the messaging layer. The call chain is: msg_post_recv: suffix_post_recv: tlv_post_recv: mgt_post_recv: and then, in tlv.c, switch (id) { ... case TLV_PORT_STATS_NP: ... } That is the place to call le64_to_cpu() on the table of statistics. In this way, every user of the message receive path always will have the message in native byte order. > + getStat(pcp, true, DELAY_REQ), > + getStat(pcp, true, PDELAY_REQ), > + getStat(pcp, true, PDELAY_RESP), > + getStat(pcp, true, FOLLOW_UP), > + getStat(pcp, true, DELAY_RESP), > + getStat(pcp, true, PDELAY_RESP_FOLLOW_UP), > + getStat(pcp, true, ANNOUNCE), > + getStat(pcp, true, SIGNALING), > + getStat(pcp, true, MANAGEMENT), > + getStat(pcp, false, SYNC), > + getStat(pcp, false, DELAY_REQ), > + getStat(pcp, false, PDELAY_REQ), > + getStat(pcp, false, PDELAY_RESP), > + getStat(pcp, false, FOLLOW_UP), > + getStat(pcp, false, DELAY_RESP), > + getStat(pcp, false, PDELAY_RESP_FOLLOW_UP), > + getStat(pcp, false, ANNOUNCE), > + getStat(pcp, false, SIGNALING), > + getStat(pcp, false, MANAGEMENT)); > break; > case TLV_LOG_ANNOUNCE_INTERVAL: > mtd = (struct management_tlv_datum *) mgt->data; > diff --git a/port.c b/port.c > index cefe780..7f45bf3 100644 > --- a/port.c > +++ b/port.c > @@ -806,6 +806,7 @@ static int port_management_fill_response(struct port > *target, > uint16_t u16; > uint8_t *buf; > int datalen; > + int i; > > extra = tlv_extra_alloc(); > if (!extra) { > @@ -958,7 +959,10 @@ static int port_management_fill_response(struct port > *target, > case TLV_PORT_STATS_NP: > psn = (struct port_stats_np *)tlv->data; > psn->portIdentity = target->portIdentity; > - psn->stats = target->stats; > + for (i = 0 ; i < MAX_MESSAGE_TYPES; i++) { > + psn->stats.rxMsgType[i] = > htole64(target->stats.rxMsgType[i]); > + psn->stats.txMsgType[i] = > htole64(target->stats.txMsgType[i]); Similarly, this belongs in mgt_pre_send(). > + } > datalen = sizeof(*psn); > break; > default: > -- > 2.20.1 Thanks, Richard ___ Linuxptp-devel mailing list Linuxptp-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxptp-devel
[Linuxptp-devel] [PATCH 2/2] Ensure TLV_PORT_STATS_NP statistics uses little endian
As most of us use little endian hardware and to retain backward compatible with most of us, we decide to use little endian. Signed-off-by: Erez Geva --- pmc.c | 51 +++ port.c | 6 +- 2 files changed, 36 insertions(+), 21 deletions(-) diff --git a/pmc.c b/pmc.c index 1e569b5..9cf52c6 100644 --- a/pmc.c +++ b/pmc.c @@ -137,6 +137,17 @@ static void pmc_show_signaling(struct ptp_message *msg, FILE *fp) fflush(fp); } +static inline uint64_t getStat(struct port_stats_np *pcp, bool rx, int index) +{ + uint64_t ret; + + if (rx) + ret = pcp->stats.rxMsgType[index]; + else + ret = pcp->stats.txMsgType[index]; + return le64toh(ret); +} + static void pmc_show(struct ptp_message *msg, FILE *fp) { struct grandmaster_settings_np *gsn; @@ -469,26 +480,26 @@ static void pmc_show(struct ptp_message *msg, FILE *fp) IFMT "tx_Signaling %" PRIu64 IFMT "tx_Management %" PRIu64, pid2str(>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]); + getStat(pcp, true, SYNC), + getStat(pcp, true, DELAY_REQ), + getStat(pcp, true, PDELAY_REQ), + getStat(pcp, true, PDELAY_RESP), + getStat(pcp, true, FOLLOW_UP), + getStat(pcp, true, DELAY_RESP), + getStat(pcp, true, PDELAY_RESP_FOLLOW_UP), + getStat(pcp, true, ANNOUNCE), + getStat(pcp, true, SIGNALING), + getStat(pcp, true, MANAGEMENT), + getStat(pcp, false, SYNC), + getStat(pcp, false, DELAY_REQ), + getStat(pcp, false, PDELAY_REQ), + getStat(pcp, false, PDELAY_RESP), + getStat(pcp, false, FOLLOW_UP), + getStat(pcp, false, DELAY_RESP), + getStat(pcp, false, PDELAY_RESP_FOLLOW_UP), + getStat(pcp, false, ANNOUNCE), + getStat(pcp, false, SIGNALING), + getStat(pcp, false, MANAGEMENT)); break; case TLV_LOG_ANNOUNCE_INTERVAL: mtd = (struct management_tlv_datum *) mgt->data; diff --git a/port.c b/port.c index cefe780..7f45bf3 100644 --- a/port.c +++ b/port.c @@ -806,6 +806,7 @@ static int port_management_fill_response(struct port *target, uint16_t u16; uint8_t *buf; int datalen; + int i; extra = tlv_extra_alloc(); if (!extra) { @@ -958,7 +959,10 @@ static int port_management_fill_response(struct port *target, case TLV_PORT_STATS_NP: psn = (struct port_stats_np *)tlv->data; psn->portIdentity = target->portIdentity; - psn->stats = target->stats; + for (i = 0 ; i < MAX_MESSAGE_TYPES; i++) { + psn->stats.rxMsgType[i] = htole64(target->stats.rxMsgType[i]); + psn->stats.txMsgType[i] = htole64(target->stats.txMsgType[i]); + } datalen = sizeof(*psn); break; default: -- 2.20.1 ___ Linuxptp-devel mailing list Linuxptp-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxptp-devel