Commit 33064df0 authored by Adam Wujek's avatar Adam Wujek 💬

[FEATURE: 1825] disect WR frames in ptpdump

Disect WR frames in ptpdump and during printing debug info in PPSi.
Current implementation prints deltaTX and deltaRx in hex not in decimal.
Signed-off-by: Adam Wujek's avatarAdam Wujek <adam.wujek@cern.ch>
parent 5a69f89b
......@@ -10,6 +10,19 @@
#include "decent_types.h"
#include "ptpdump.h"
#define WR_MODE_ON_MASK 0x8
#define CALIBRATED_MASK 0x4
#define WR_CONFIG_MASK 0x3
static char *wr_message_name[] = {
"SLAVE_PRESENT",
"LOCK",
"LOCKED",
"CALIBRATE",
"CALIBRATED",
"WR_MODE_ON",
};
static int dump_vlan(char *prefix, int vlan);
static int dumpstruct(char *p1, char *p2, char *name, void *ptr, int size)
......@@ -152,11 +165,13 @@ static void dump_msg_resp_etc(char *prefix, char *s, struct ptp_sync_etc *p)
dump_1port(prefix, s, p->port);
}
/* TLV dumper, not yet white-rabbit aware */
/* TLV dumper, now white-rabbit aware */
static int dump_tlv(char *prefix, struct ptp_tlv *tlv, int totallen)
{
/* the field includes 6 bytes of the header, ecludes 4 of them. Bah! */
int explen = ntohs(tlv->len) + 4;
uint16_t messageId;
char *messageId_str = NULL;
printf("%sTLV: type %04x len %i oui %02x:%02x:%02x "
"sub %02x:%02x:%02x\n", prefix, ntohs(tlv->type), explen,
......@@ -167,12 +182,97 @@ static int dump_tlv(char *prefix, struct ptp_tlv *tlv, int totallen)
explen, totallen);
return totallen;
}
if (memcmp(tlv->oui, "\x08\x00\x30", 3) /* WR_TLV_ORGANIZATION_ID */
/* WR_TLV_MAGIC_NUMBER, WR_TLV_WR_VERSION_NUMBER */
|| memcmp(tlv->subtype, "\xDE\xAD\x01", 3)
) {
/* Now dump non-wr tlv in binary, count only payload */
dumpstruct(prefix, "TLV: ", "tlv-content", tlv->data,
explen - sizeof(*tlv));
return explen;
}
messageId = (tlv->data[0] << 8) + tlv->data[1];
if (SLAVE_PRESENT <= messageId && messageId <= WR_MODE_ON)
messageId_str = wr_message_name[messageId - SLAVE_PRESENT];
if (messageId == ANN_SUFIX)
messageId_str = "ANN_SUFIX";
if (messageId_str) {
printf("%sTLV: messageId %s(0x%x)\n", prefix, messageId_str,
messageId);
switch(messageId){
case SLAVE_PRESENT:
case LOCK:
case LOCKED:
case WR_MODE_ON:
/* no more to be printed */
break;
case CALIBRATE:
if (totallen < 8 || explen < 8) { /* 2+1+1+4 */
printf("%sTLV: too short (expected %i, total "
"%i)\n", prefix, explen, totallen);
return totallen;
}
printf("%sTLV: calSendPattern %s, calRetry %u, "
"calPeriod %d\n",
prefix,
tlv->data[2] ? "True":"False",
tlv->data[3],
(tlv->data[4] << 24) + (tlv->data[5] << 16)
+ (tlv->data[6] << 8) + tlv->data[7]
);
break;
case CALIBRATED:
/* TODO: print as ints */
if (totallen < 18 || explen < 18) { /* 2+8+8 */
printf("%sTLV: too short (expected %i, total "
"%i)\n", prefix, explen, totallen);
return totallen;
}
dumpstruct(prefix, "TLV: ", "deltaTx", &tlv->data[2],
8);
dumpstruct(prefix, "TLV: ", "deltaRx", &tlv->data[10],
8);
break;
case ANN_SUFIX:
{
int flags = tlv->data[3]; /* data[2] is unused */
char *wr_config_str;
if (totallen < 4 || explen < 4) { /* 2+2 */
printf("%sTLV: too short (expected %i, total "
"%i)\n", prefix, explen, totallen);
return totallen;
}
switch (flags & WR_CONFIG_MASK) {
case NON_WR:
wr_config_str = "NON_WR";
break;
case WR_S_ONLY:
wr_config_str = "WR_S_ONLY";
break;
case WR_M_ONLY:
wr_config_str = "WR_M_ONLY";
break;
case WR_M_AND_S:
wr_config_str = "WR_M_AND_S";
break;
default:
break;
}
printf("%sTLV: wrFlags: wrConfig %s, calibrated %s, "
"wrModeOn %s\n",
prefix,
wr_config_str,
flags & CALIBRATED_MASK ? "True":"False",
flags & WR_MODE_ON_MASK ? "True":"False"
);
break;
}
}
}
/* later: if (memcmp(tlv->oui, "\x08\x00\x30", 3)) ... */
/* Now dump non-wr tlv in binary, count only payload */
dumpstruct(prefix, "TLV: ", "tlv-content", tlv->data,
explen - sizeof(*tlv));
return explen;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment