2 * Redistribution and use in source and binary forms, with or without
3 * modification, are permitted provided that: (1) source code
4 * distributions retain the above copyright notice and this paragraph
5 * in its entirety, and (2) distributions including binary code include
6 * the above copyright notice and this paragraph in its entirety in
7 * the documentation or other materials provided with the distribution.
8 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
9 * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
10 * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
11 * FOR A PARTICULAR PURPOSE.
13 * Original code by Partha S. Ghosh (psglinux dot gmail dot com)
16 /* \summary: Precision Time Protocol (PTP) printer */
18 /* specification: https://standards.ieee.org/findstds/standard/1588-2008.html*/
24 #include "netdissect-stdinc.h"
25 #include "netdissect.h"
32 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
33 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
34 * | R | |msgtype| version | Msg Len |
35 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
36 * | domain No | rsvd1 | flag Field |
37 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
39 * | Correction Sub NS |
40 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
42 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
45 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
46 * | Port Identity | Sequence ID |
47 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
48 * | control | log msg int |
49 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
50 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
53 * Announce Message (msg type=0xB)
55 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
56 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
58 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
60 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
62 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
63 * | Origin Cur UTC Offset | Reserved | GM Prio 1 |
64 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
65 * |GM Clock Class | GM Clock Accu | GM Clock Variance |
66 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
69 * | GM Clock Identity |
70 * + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
71 * | | Steps Removed | Time Source |
72 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
73 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
76 * Sync Message (msg type=0x0)
78 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
79 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
81 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
83 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
85 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
87 * Delay Request Message (msg type=0x1)
89 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
90 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
92 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
93 * | Origin Time Stamp Seconds |
94 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
96 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
98 * Followup Message (msg type=0x8)
100 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
101 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
103 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
104 * | Precise Origin Time Stamp Seconds |
105 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
107 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
109 * Delay Resp Message (msg type=0x9)
111 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
112 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
114 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
116 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
118 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
120 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
122 * PDelay Request Message (msg type=0x2)
124 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
125 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
127 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
128 * | Origin Time Stamp Seconds |
129 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
130 * | Origin Time Stamp Nano Seconds |
131 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
133 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
135 * PDelay Response Message (msg type=0x3)
137 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
138 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
140 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
141 * | Request receipt Time Stamp Seconds |
142 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
144 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
145 * | Requesting Port Identity |
146 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
148 * PDelay Resp Follow up Message (msg type=0xA)
150 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
151 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
153 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
154 * | Response Origin Time Stamp Seconds |
155 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
157 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
158 * | Requesting Port Identity |
159 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
161 * Signalling Message (msg type=0xC)
163 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
164 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
165 * | Requesting Port Identity |
166 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
168 * Management Message (msg type=0xD)
170 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
171 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
172 * | Requesting Port Identity |
173 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
174 * |Start Bndry Hps| Boundary Hops | flags | Reserved |
175 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
180 #define M_DELAY_REQ 0x1
181 #define M_PDELAY_REQ 0x2
182 #define M_PDELAY_RESP 0x3
184 #define M_FOLLOW_UP 0x8
185 #define M_DELAY_RESP 0x9
186 #define M_PDELAY_RESP_FOLLOW_UP 0xA
187 #define M_ANNOUNCE 0xB
188 #define M_SIGNALLING 0xC
189 #define M_MANAGEMENT 0xD
191 static const struct tok ptp_msg_type
[] = {
192 { M_SYNC
,"sync msg"},
193 { M_DELAY_REQ
,"delay req msg"},
194 { M_PDELAY_REQ
,"peer delay req msg"},
195 { M_PDELAY_RESP
,"peer delay resp msg"},
197 { M_FOLLOW_UP
,"follow up msg"},
198 { M_DELAY_RESP
,"delay resp msg"},
199 { M_PDELAY_RESP_FOLLOW_UP
,"pdelay resp fup msg"},
200 { M_ANNOUNCE
,"announce msg"},
201 { M_SIGNALLING
,"signalling msg"},
202 { M_MANAGEMENT
,"management msg"},
208 #define PTP_FALSE !PTP_TRUE
210 #define PTP_HDR_LEN 0x22
212 /* mask based on the first byte */
213 #define PTP_VERS_MASK 0xFF
214 #define PTP_V1_COMPAT 0x10
215 #define PTP_MSG_TYPE_MASK 0x0F
217 /*mask based 2byte */
218 #define PTP_DOMAIN_MASK 0xFF00
219 #define PTP_RSVD1_MASK 0xFF
220 #define PTP_CONTROL_MASK 0xFF
221 #define PTP_LOGMSG_MASK 0xFF
223 /* mask based on the flags 2 bytes */
225 #define PTP_L161_MASK 0x1
226 #define PTP_L1_59_MASK 0x2
227 #define PTP_UTC_REASONABLE_MASK 0x4
228 #define PTP_TIMESCALE_MASK 0x8
229 #define PTP_TIME_TRACABLE_MASK 0x10
230 #define PTP_FREQUENCY_TRACABLE_MASK 0x20
231 #define PTP_ALTERNATE_MASTER_MASK 0x100
232 #define PTP_TWO_STEP_MASK 0x200
233 #define PTP_UNICAST_MASK 0x400
234 #define PTP_PROFILE_SPEC_1_MASK 0x1000
235 #define PTP_PROFILE_SPEC_2_MASK 0x2000
236 #define PTP_SECURITY_MASK 0x4000
237 #define PTP_FLAGS_UNKNOWN_MASK 0x18C0
240 static const struct tok ptp_flag_values
[] = {
241 { PTP_L161_MASK
,"l1 61"},
242 { PTP_L1_59_MASK
,"l1 59"},
243 { PTP_UTC_REASONABLE_MASK
,"utc reasonable"},
244 { PTP_TIMESCALE_MASK
,"timescale"},
245 { PTP_TIME_TRACABLE_MASK
,"time tracable"},
246 { PTP_FREQUENCY_TRACABLE_MASK
,"frequency tracable"},
247 { PTP_ALTERNATE_MASTER_MASK
,"alternate master"},
248 { PTP_TWO_STEP_MASK
,"two step"},
249 { PTP_UNICAST_MASK
,"unicast"},
250 { PTP_PROFILE_SPEC_1_MASK
,"profile specific 1"},
251 { PTP_PROFILE_SPEC_2_MASK
,"profile specific 2"},
252 { PTP_SECURITY_MASK
,"security mask"},
253 { PTP_FLAGS_UNKNOWN_MASK
, "unknown"},
257 #define PTP_PRINT_MSG_TYPE(e) \
259 ND_PRINT("(%s)", tok2str(ptp_msg_type, "unknown", e)); \
262 const char *p_porigin_ts
= "preciseOriginTimeStamp";
263 const char *p_origin_ts
= "originTimeStamp";
264 const char *p_recv_ts
= "receiveTimeStamp";
266 #define PTP_VER_1 0x1
267 #define PTP_VER_2 0x2
269 #define PTP_UCHAR_LEN sizeof(uint8_t)
270 #define PTP_UINT16_LEN sizeof(uint16_t)
271 #define PTP_UINT32_LEN sizeof(uint32_t)
272 #define PTP_6BYTES_LEN sizeof(uint32_t)+sizeof(uint16_t)
273 #define PTP_UINT64_LEN sizeof(uint64_t)
277 static void ptp_print_1(netdissect_options
*ndo
);
278 static void ptp_print_2(netdissect_options
*ndo
, const u_char
*bp
, u_int len
);
280 static void ptp_print_timestamp(netdissect_options
*ndo
, const u_char
*bp
, u_int
*len
, const char *stype
);
281 static void ptp_print_timestamp_identity(netdissect_options
*ndo
, const u_char
*bp
, u_int
*len
, const char *ttype
);
282 static void ptp_print_announce_msg(netdissect_options
*ndo
, const u_char
*bp
, u_int
*len
);
283 static void ptp_print_port_id(netdissect_options
*ndo
, const u_char
*bp
, u_int
*len
);
284 static void ptp_print_mgmt_msg(netdissect_options
*ndo
, const u_char
*bp
, u_int
*len
);
287 print_field(netdissect_options
*ndo
, const char *st
, uint32_t flen
,
288 const u_char
*bp
, u_int
*len
, uint8_t hex
)
297 u8_val
= GET_U_1(bp
);
298 ND_PRINT(", %s", st
);
300 ND_PRINT(" 0x%x", u8_val
);
302 ND_PRINT(" %u", u8_val
);
306 u16_val
= GET_BE_U_2(bp
);
307 ND_PRINT(", %s", st
);
309 ND_PRINT(" 0x%x", u16_val
);
311 ND_PRINT(" %u", u16_val
);
315 u32_val
= GET_BE_U_4(bp
);
316 ND_PRINT(", %s", st
);
318 ND_PRINT(" 0x%x", u32_val
);
320 ND_PRINT(" %u", u32_val
);
324 u64_val
= GET_BE_U_8(bp
);
325 ND_PRINT(", %s", st
);
327 ND_PRINT(" 0x%"PRIx64
, u64_val
);
329 ND_PRINT(" 0x%"PRIu64
, u64_val
);
338 ptp_print_1(netdissect_options
*ndo
)
340 ND_PRINT(" (not implemented)");
343 static void ptp_print_2(netdissect_options
*ndo
, const u_char
*bp
, u_int length
)
346 uint16_t msg_len
, flags
, port_id
, seq_id
;
347 uint8_t foct
, domain_no
, msg_type
, v1_compat
, rsvd1
, lm_int
, control
;
348 uint32_t ns_corr
, sns_corr
, rsvd2
;
352 v1_compat
= foct
& PTP_V1_COMPAT
;
353 ND_PRINT(", v1 compat : %s", v1_compat
?"yes":"no");
354 msg_type
= foct
& PTP_MSG_TYPE_MASK
;
355 ND_PRINT(", msg type : %s", tok2str(ptp_msg_type
, "none", msg_type
));
358 len
-= 2; bp
+= 2; msg_len
= GET_BE_U_2(bp
); ND_PRINT(", length : %u", msg_len
);
361 len
-= 2; bp
+= 2; domain_no
= GET_BE_U_2(bp
) & PTP_DOMAIN_MASK
; ND_PRINT(", domain : %u", domain_no
);
364 rsvd1
= GET_BE_U_2(bp
) & PTP_RSVD1_MASK
;
365 ND_PRINT(", reserved1 : %u", rsvd1
);
368 len
-= 2; bp
+= 2; flags
= GET_BE_U_2(bp
); ND_PRINT(", Flags [%s]", bittok2str(ptp_flag_values
, "none", flags
));
371 len
-= 2; bp
+= 2; ns_corr
= GET_BE_U_4(bp
); ND_PRINT(", NS correction : %u", ns_corr
);
373 /* correction sub NS */
374 len
-= 4; bp
+= 4; sns_corr
= GET_BE_U_4(bp
); ND_PRINT(", sub NS correction : %u", sns_corr
);
377 len
-= 4; bp
+= 4; rsvd2
= GET_BE_U_4(bp
); ND_PRINT(", reserved2 : %u", rsvd2
);
380 len
-= 4; bp
+= 4; clk_id
= GET_BE_U_8(bp
); ND_PRINT(", clock identity : 0x%"PRIx64
, clk_id
);
383 len
-= 8; bp
+= 8; port_id
= GET_BE_U_2(bp
); ND_PRINT(", port id : %u", port_id
);
386 len
-= 2; bp
+= 2; seq_id
= GET_BE_U_2(bp
); ND_PRINT(", seq id : %u", seq_id
);
389 len
-= 2; bp
+= 2; control
= GET_U_1(bp
) ;
390 ND_PRINT(", control : %u (%s)", control
, tok2str(ptp_msg_type
, "none", control
));
392 /* log message interval */
393 lm_int
= GET_BE_U_2(bp
) & PTP_LOGMSG_MASK
; ND_PRINT(", log message interval : %u", lm_int
); len
-= 2; bp
+= 2;
397 ptp_print_timestamp(ndo
, bp
, &len
, p_origin_ts
);
400 ptp_print_timestamp(ndo
, bp
, &len
, p_origin_ts
);
403 ptp_print_timestamp_identity(ndo
, bp
, &len
, p_porigin_ts
);
406 ptp_print_timestamp_identity(ndo
, bp
, &len
, p_recv_ts
);
409 ptp_print_timestamp(ndo
, bp
, &len
, p_porigin_ts
);
412 ptp_print_timestamp_identity(ndo
, bp
, &len
, p_recv_ts
);
414 case M_PDELAY_RESP_FOLLOW_UP
:
415 ptp_print_timestamp_identity(ndo
, bp
, &len
, p_porigin_ts
);
418 ptp_print_announce_msg(ndo
, bp
, &len
);
421 ptp_print_port_id(ndo
, bp
, &len
);
424 ptp_print_mgmt_msg(ndo
, bp
, &len
);
431 * PTP general message
434 ptp_print(netdissect_options
*ndo
, const u_char
*bp
, u_int len
)
438 ndo
->ndo_protocol
= "ptp";
439 if (len
< PTP_HDR_LEN
) {
442 vers
= GET_BE_U_2(bp
) & PTP_VERS_MASK
;
443 ND_PRINT("PTPv%u",vers
);
449 ptp_print_2(ndo
, bp
, len
);
452 //ND_PRINT("ERROR: unknown-version\n");
463 ptp_print_timestamp(netdissect_options
*ndo
, const u_char
*bp
, u_int
*len
, const char *stype
)
468 ND_PRINT(", %s :", stype
);
469 /* sec time stamp 6 bytes */
470 secs
= GET_BE_U_2(bp
) + GET_BE_U_4(bp
+2);
471 ND_PRINT(" %"PRIu64
" seconds,", secs
);
475 /* NS time stamp 4 bytes */
476 nsecs
= GET_BE_U_4(bp
);
477 ND_PRINT(" %u nanoseconds", nsecs
);
482 ptp_print_timestamp_identity(netdissect_options
*ndo
,
483 const u_char
*bp
, u_int
*len
, const char *ttype
)
488 uint64_t port_identity
;
490 ND_PRINT(", %s :", ttype
);
491 /* sec time stamp 6 bytes */
492 secs
= GET_BE_U_2(bp
) + GET_BE_U_4(bp
+2);
493 ND_PRINT(" %"PRIu64
" seconds,", secs
);
497 /* NS time stamp 4 bytes */
498 nsecs
= GET_BE_U_4(bp
);
499 ND_PRINT(" %u nanoseconds", nsecs
);
504 port_identity
= GET_BE_U_8(bp
);
505 ND_PRINT(", port identity : 0x%"PRIx64
, port_identity
);
510 port_id
= GET_BE_U_2(bp
);
511 ND_PRINT(", port id : %u", port_id
);
516 ptp_print_announce_msg(netdissect_options
*ndo
, const u_char
*bp
, u_int
*len
)
518 uint8_t rsvd
, gm_prio_1
, gm_prio_2
, gm_clk_cls
, gm_clk_acc
, time_src
;
519 uint16_t origin_cur_utc
, gm_clk_var
, steps_removed
;
520 uint64_t gm_clock_id
;
524 ND_PRINT(", %s :", p_origin_ts
);
525 /* sec time stamp 6 bytes */
526 secs
= GET_BE_U_2(bp
) + GET_BE_U_4(bp
+2);
527 ND_PRINT(" %"PRIu64
" seconds", secs
);
531 /* NS time stamp 4 bytes */
532 nsecs
= GET_BE_U_4(bp
);
533 ND_PRINT(" %u nanoseconds", nsecs
);
538 origin_cur_utc
= GET_BE_U_2(bp
);
539 ND_PRINT(", origin cur utc :%u", origin_cur_utc
);
545 ND_PRINT(", rsvd : %u", rsvd
);
550 gm_prio_1
= GET_U_1(bp
);
551 ND_PRINT(", gm priority_1 : %u", gm_prio_1
);
556 gm_clk_cls
= GET_U_1(bp
);
557 ND_PRINT(", gm clock class : %u", gm_clk_cls
);
560 /* GM clock accuracy */
561 gm_clk_acc
= GET_U_1(bp
);
562 ND_PRINT(", gm clock accuracy : %u", gm_clk_acc
);
565 /* GM clock variance */
566 gm_clk_var
= GET_BE_U_2(bp
);
567 ND_PRINT(", gm clock variance : %u", gm_clk_var
);
571 gm_prio_2
= GET_U_1(bp
);
572 ND_PRINT(", gm priority_2 : %u", gm_prio_2
);
576 /* GM Clock Identity */
577 gm_clock_id
= GET_BE_U_8(bp
);
578 ND_PRINT(", gm clock id : 0x%"PRIx64
, gm_clock_id
);
582 steps_removed
= GET_BE_U_2(bp
);
583 ND_PRINT(", steps removed : %u", steps_removed
);
587 time_src
= GET_U_1(bp
);
588 ND_PRINT(", time source : 0x%x", time_src
);
594 ptp_print_port_id(netdissect_options
*ndo
, const u_char
*bp
, u_int
*len
)
597 uint64_t port_identity
;
600 port_identity
= GET_BE_U_8(bp
);
601 ND_PRINT(", port identity : 0x%"PRIx64
, port_identity
);
606 port_id
= GET_BE_U_2(bp
);
607 ND_PRINT(", port id : %u", port_id
);
614 ptp_print_mgmt_msg(netdissect_options
*ndo
, const u_char
*bp
, u_int
*len
)
616 ptp_print_port_id(ndo
, bp
, len
);
617 print_field(ndo
, ", start boundary hops ", PTP_UCHAR_LEN
, bp
, len
, PTP_FALSE
);
618 print_field(ndo
, ", boundary hops ", PTP_UCHAR_LEN
, bp
, len
, PTP_FALSE
);
619 print_field(ndo
, ", flags ", PTP_UCHAR_LEN
, bp
, len
, PTP_TRUE
);
620 print_field(ndo
, ", reserved ", PTP_UCHAR_LEN
, bp
, len
, PTP_TRUE
);