X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/2ff501f5499085b6c89879ab4522beff3a8f92b5..d9acf8cb11e30b7d7744cb0dd05e628109cb73f0:/print-ptp.c diff --git a/print-ptp.c b/print-ptp.c index 27a96438..a41f5a92 100644 --- a/print-ptp.c +++ b/print-ptp.c @@ -24,7 +24,6 @@ #include "netdissect-stdinc.h" #include "netdissect.h" #include "extract.h" -#include /* * PTP header @@ -36,7 +35,8 @@ * | domain No | rsvd1 | flag Field | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Correction NS | - * | Correction Sub NS | + * + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | | Correction Sub NS | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Reserved2 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -189,21 +189,20 @@ #define M_MANAGEMENT 0xD static const struct tok ptp_msg_type[] = { - { M_SYNC ,"sync msg"}, - { M_DELAY_REQ ,"delay req msg"}, - { M_PDELAY_REQ ,"peer delay req msg"}, - { M_PDELAY_RESP ,"peer delay resp msg"}, + { M_SYNC, "sync msg"}, + { M_DELAY_REQ, "delay req msg"}, + { M_PDELAY_REQ, "peer delay req msg"}, + { M_PDELAY_RESP, "peer delay resp msg"}, { M_OTHER, "Other"}, - { M_FOLLOW_UP ,"follow up msg"}, - { M_DELAY_RESP ,"delay resp msg"}, - { M_PDELAY_RESP_FOLLOW_UP ,"pdelay resp fup msg"}, - { M_ANNOUNCE ,"announce msg"}, - { M_SIGNALLING ,"signalling msg"}, - { M_MANAGEMENT ,"management msg"}, + { M_FOLLOW_UP, "follow up msg"}, + { M_DELAY_RESP, "delay resp msg"}, + { M_PDELAY_RESP_FOLLOW_UP, "pdelay resp fup msg"}, + { M_ANNOUNCE, "announce msg"}, + { M_SIGNALLING, "signalling msg"}, + { M_MANAGEMENT, "management msg"}, { 0, NULL} }; - #define PTP_TRUE 1 #define PTP_FALSE !PTP_TRUE @@ -236,32 +235,26 @@ static const struct tok ptp_msg_type[] = { #define PTP_SECURITY_MASK 0x4000 #define PTP_FLAGS_UNKNOWN_MASK 0x18C0 - static const struct tok ptp_flag_values[] = { - { PTP_L161_MASK ,"l1 61"}, - { PTP_L1_59_MASK ,"l1 59"}, - { PTP_UTC_REASONABLE_MASK ,"utc reasonable"}, - { PTP_TIMESCALE_MASK ,"timescale"}, - { PTP_TIME_TRACABLE_MASK ,"time tracable"}, - { PTP_FREQUENCY_TRACABLE_MASK ,"frequency tracable"}, - { PTP_ALTERNATE_MASTER_MASK ,"alternate master"}, - { PTP_TWO_STEP_MASK ,"two step"}, - { PTP_UNICAST_MASK ,"unicast"}, - { PTP_PROFILE_SPEC_1_MASK ,"profile specific 1"}, - { PTP_PROFILE_SPEC_2_MASK ,"profile specific 2"}, - { PTP_SECURITY_MASK ,"security mask"}, - { PTP_FLAGS_UNKNOWN_MASK , "unknown"}, + { PTP_L161_MASK, "l1 61"}, + { PTP_L1_59_MASK, "l1 59"}, + { PTP_UTC_REASONABLE_MASK, "utc reasonable"}, + { PTP_TIMESCALE_MASK, "timescale"}, + { PTP_TIME_TRACABLE_MASK, "time tracable"}, + { PTP_FREQUENCY_TRACABLE_MASK, "frequency tracable"}, + { PTP_ALTERNATE_MASTER_MASK, "alternate master"}, + { PTP_TWO_STEP_MASK, "two step"}, + { PTP_UNICAST_MASK, "unicast"}, + { PTP_PROFILE_SPEC_1_MASK, "profile specific 1"}, + { PTP_PROFILE_SPEC_2_MASK, "profile specific 2"}, + { PTP_SECURITY_MASK, "security mask"}, + { PTP_FLAGS_UNKNOWN_MASK, "unknown"}, {0, NULL} }; -#define PTP_PRINT_MSG_TYPE(e) \ - { \ - ND_PRINT("(%s)", tok2str(ptp_msg_type, "unknown", e)); \ - } - -const char *p_porigin_ts = "preciseOriginTimeStamp"; -const char *p_origin_ts = "originTimeStamp"; -const char *p_recv_ts = "receiveTimeStamp"; +static const char *p_porigin_ts = "preciseOriginTimeStamp"; +static const char *p_origin_ts = "originTimeStamp"; +static const char *p_recv_ts = "receiveTimeStamp"; #define PTP_VER_1 0x1 #define PTP_VER_2 0x2 @@ -272,8 +265,6 @@ const char *p_recv_ts = "receiveTimeStamp"; #define PTP_6BYTES_LEN sizeof(uint32_t)+sizeof(uint16_t) #define PTP_UINT64_LEN sizeof(uint64_t) - - static void ptp_print_1(netdissect_options *ndo); static void ptp_print_2(netdissect_options *ndo, const u_char *bp, u_int len); @@ -337,15 +328,18 @@ print_field(netdissect_options *ndo, const char *st, uint32_t flen, static void ptp_print_1(netdissect_options *ndo) { - ND_PRINT("ptp version 1: not implemented\n"); + ND_PRINT(" (not implemented)"); } -static void ptp_print_2(netdissect_options *ndo, const u_char *bp, u_int length) +static void +ptp_print_2(netdissect_options *ndo, const u_char *bp, u_int length) { u_int len = length; uint16_t msg_len, flags, port_id, seq_id; uint8_t foct, domain_no, msg_type, v1_compat, rsvd1, lm_int, control; - uint32_t ns_corr, sns_corr, rsvd2; + uint64_t ns_corr; + uint16_t sns_corr; + uint32_t rsvd2; uint64_t clk_id; foct = GET_U_1(bp); @@ -358,7 +352,7 @@ static void ptp_print_2(netdissect_options *ndo, const u_char *bp, u_int length) len -= 2; bp += 2; msg_len = GET_BE_U_2(bp); ND_PRINT(", length : %u", msg_len); /* domain */ - len -= 2; bp += 2; domain_no = GET_BE_U_2(bp) & PTP_DOMAIN_MASK; ND_PRINT(", domain : %u", domain_no); + len -= 2; bp += 2; domain_no = (GET_BE_U_2(bp) & PTP_DOMAIN_MASK) >> 8; ND_PRINT(", domain : %u", domain_no); /* rsvd 1*/ rsvd1 = GET_BE_U_2(bp) & PTP_RSVD1_MASK; @@ -367,14 +361,14 @@ static void ptp_print_2(netdissect_options *ndo, const u_char *bp, u_int length) /* flags */ len -= 2; bp += 2; flags = GET_BE_U_2(bp); ND_PRINT(", Flags [%s]", bittok2str(ptp_flag_values, "none", flags)); - /* correction NS */ - len -= 2; bp += 2; ns_corr = GET_BE_U_4(bp); ND_PRINT(", NS correction : %u", ns_corr); + /* correction NS (48 bits) */ + len -= 2; bp += 2; ns_corr = GET_BE_U_6(bp); ND_PRINT(", NS correction : %"PRIu64, ns_corr); - /* correction sub NS */ - len -= 4; bp += 4; sns_corr = GET_BE_U_4(bp); ND_PRINT(", sub NS correction : %u", sns_corr); + /* correction sub NS (16 bits) */ + len -= 6; bp += 6; sns_corr = GET_BE_U_2(bp); ND_PRINT(", sub NS correction : %u", sns_corr); /* Reserved 2 */ - len -= 4; bp += 4; rsvd2 = GET_BE_U_4(bp); ND_PRINT(", reserved2 : %u", rsvd2); + len -= 2; bp += 2; rsvd2 = GET_BE_U_4(bp); ND_PRINT(", reserved2 : %u", rsvd2); /* clock identity */ len -= 4; bp += 4; clk_id = GET_BE_U_8(bp); ND_PRINT(", clock identity : 0x%"PRIx64, clk_id); @@ -431,14 +425,12 @@ static void ptp_print_2(netdissect_options *ndo, const u_char *bp, u_int length) * PTP general message */ void -ptp_print(netdissect_options *ndo, const u_char *bp, u_int len) +ptp_print(netdissect_options *ndo, const u_char *bp, u_int length) { u_int vers; ndo->ndo_protocol = "ptp"; - if (len < PTP_HDR_LEN) { - goto trunc; - } + ND_LCHECK_U(length, PTP_HDR_LEN); vers = GET_BE_U_2(bp) & PTP_VERS_MASK; ND_PRINT("PTPv%u",vers); switch(vers) { @@ -446,7 +438,7 @@ ptp_print(netdissect_options *ndo, const u_char *bp, u_int len) ptp_print_1(ndo); break; case PTP_VER_2: - ptp_print_2(ndo, bp, len); + ptp_print_2(ndo, bp, length); break; default: //ND_PRINT("ERROR: unknown-version\n"); @@ -454,9 +446,8 @@ ptp_print(netdissect_options *ndo, const u_char *bp, u_int len) } return; -trunc: - nd_print_trunc(ndo); - return; +invalid: + nd_print_invalid(ndo); } static void @@ -467,7 +458,7 @@ ptp_print_timestamp(netdissect_options *ndo, const u_char *bp, u_int *len, const ND_PRINT(", %s :", stype); /* sec time stamp 6 bytes */ - secs = GET_BE_U_2(bp) + GET_BE_U_4(bp+2); + secs = GET_BE_U_6(bp); ND_PRINT(" %"PRIu64" seconds,", secs); *len -= 6; bp += 6; @@ -489,7 +480,7 @@ ptp_print_timestamp_identity(netdissect_options *ndo, ND_PRINT(", %s :", ttype); /* sec time stamp 6 bytes */ - secs = GET_BE_U_2(bp) + GET_BE_U_4(bp+2); + secs = GET_BE_U_6(bp); ND_PRINT(" %"PRIu64" seconds,", secs); *len -= 6; bp += 6; @@ -523,7 +514,7 @@ ptp_print_announce_msg(netdissect_options *ndo, const u_char *bp, u_int *len) ND_PRINT(", %s :", p_origin_ts); /* sec time stamp 6 bytes */ - secs = GET_BE_U_2(bp) + GET_BE_U_4(bp+2); + secs = GET_BE_U_6(bp); ND_PRINT(" %"PRIu64" seconds", secs); *len -= 6; bp += 6;