Re: [Linuxptp-devel] [PATCH 2/2] Ensure TLV_PORT_STATS_NP statistics uses little endian

2021-03-13 Thread Richard Cochran
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

2021-03-11 Thread Erez Geva
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