xref: /freebsd/contrib/tcpdump/print-ptp.c (revision 0a7e5f1f02aad2ff5fff1c60f44c6975fd07e1d9)
1ee67461eSJoseph Mingrone /*
2ee67461eSJoseph Mingrone  * Redistribution and use in source and binary forms, with or without
3ee67461eSJoseph Mingrone  * modification, are permitted provided that: (1) source code
4ee67461eSJoseph Mingrone  * distributions retain the above copyright notice and this paragraph
5ee67461eSJoseph Mingrone  * in its entirety, and (2) distributions including binary code include
6ee67461eSJoseph Mingrone  * the above copyright notice and this paragraph in its entirety in
7ee67461eSJoseph Mingrone  * the documentation or other materials provided with the distribution.
8ee67461eSJoseph Mingrone  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
9ee67461eSJoseph Mingrone  * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
10ee67461eSJoseph Mingrone  * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
11ee67461eSJoseph Mingrone  * FOR A PARTICULAR PURPOSE.
12ee67461eSJoseph Mingrone  *
13ee67461eSJoseph Mingrone  * Original code by Partha S. Ghosh (psglinux dot gmail dot com)
14ee67461eSJoseph Mingrone  */
15ee67461eSJoseph Mingrone 
16ee67461eSJoseph Mingrone /* \summary: Precision Time Protocol (PTP) printer */
17ee67461eSJoseph Mingrone 
18ee67461eSJoseph Mingrone /* specification: https://standards.ieee.org/findstds/standard/1588-2008.html*/
19ee67461eSJoseph Mingrone 
20ee67461eSJoseph Mingrone #include <config.h>
21ee67461eSJoseph Mingrone 
22ee67461eSJoseph Mingrone #include "netdissect-stdinc.h"
23ee67461eSJoseph Mingrone #include "netdissect.h"
24ee67461eSJoseph Mingrone #include "extract.h"
25ee67461eSJoseph Mingrone 
26ee67461eSJoseph Mingrone /*
27ee67461eSJoseph Mingrone  * PTP header
28ee67461eSJoseph Mingrone  *     0                   1                   2                   3
29ee67461eSJoseph Mingrone  *     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
30ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
31ee67461eSJoseph Mingrone  *    |  R  | |msgtype|  version      |  Msg Len                      |
32ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
33ee67461eSJoseph Mingrone  *    |  domain No    | rsvd1         |   flag Field                  |
34ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
35ee67461eSJoseph Mingrone  *    |                        Correction NS                          |
36ee67461eSJoseph Mingrone  *    +                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
37ee67461eSJoseph Mingrone  *    |                               |      Correction Sub NS        |
38ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
39ee67461eSJoseph Mingrone  *    |                           Reserved2                           |
40ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
41ee67461eSJoseph Mingrone  *    |                        Clock Identity                         |
42ee67461eSJoseph Mingrone  *    |                                                               |
43ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
44ee67461eSJoseph Mingrone  *    |         Port Identity         |         Sequence ID           |
45ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
46ee67461eSJoseph Mingrone  *    |    control    |  log msg int  |
47ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
48ee67461eSJoseph Mingrone  *     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
49ee67461eSJoseph Mingrone  *     0                   1                   2                   3
50ee67461eSJoseph Mingrone  *
51ee67461eSJoseph Mingrone  * Announce Message (msg type=0xB)
52ee67461eSJoseph Mingrone  *     0                   1                   2                   3
53ee67461eSJoseph Mingrone  *     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
54ee67461eSJoseph Mingrone  *                                    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
55ee67461eSJoseph Mingrone  *                                    |                               |
56ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
57ee67461eSJoseph Mingrone  *    |                            Seconds                            |
58ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
59ee67461eSJoseph Mingrone  *    |                         Nano Seconds                          |
60ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
61ee67461eSJoseph Mingrone  *    |     Origin Cur UTC Offset     |     Reserved    | GM Prio 1   |
62ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
63ee67461eSJoseph Mingrone  *    |GM Clock Class | GM Clock Accu |        GM Clock Variance      |
64ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
65ee67461eSJoseph Mingrone  *    |   GM Prio 2   |                                               |
66ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+                                               +
67ee67461eSJoseph Mingrone  *    |                      GM Clock Identity                        |
68ee67461eSJoseph Mingrone  *    +               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
69ee67461eSJoseph Mingrone  *    |               |         Steps Removed           | Time Source |
70ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
71ee67461eSJoseph Mingrone  *     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
72ee67461eSJoseph Mingrone  *     0                   1                   2                   3
73ee67461eSJoseph Mingrone  *
74ee67461eSJoseph Mingrone  * Sync Message (msg type=0x0)
75ee67461eSJoseph Mingrone  *     0                   1                   2                   3
76ee67461eSJoseph Mingrone  *     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
77ee67461eSJoseph Mingrone  *                                    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
78ee67461eSJoseph Mingrone  *                                    |                               |
79ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
80ee67461eSJoseph Mingrone  *    |                            Seconds                            |
81ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
82ee67461eSJoseph Mingrone  *    |                         Nano Seconds                          |
83ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
84ee67461eSJoseph Mingrone  *
85ee67461eSJoseph Mingrone  *  Delay Request Message (msg type=0x1)
86ee67461eSJoseph Mingrone  *     0                   1                   2                   3
87ee67461eSJoseph Mingrone  *     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
88ee67461eSJoseph Mingrone  *                                    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
89ee67461eSJoseph Mingrone  *                                    |                               |
90ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
91ee67461eSJoseph Mingrone  *    |             Origin Time Stamp Seconds                         |
92ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
93ee67461eSJoseph Mingrone  *    |                         Nano Seconds                          |
94ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
95ee67461eSJoseph Mingrone  *
96ee67461eSJoseph Mingrone  *  Followup Message (msg type=0x8)
97ee67461eSJoseph Mingrone  *     0                   1                   2                   3
98ee67461eSJoseph Mingrone  *     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
99ee67461eSJoseph Mingrone  *                                    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
100ee67461eSJoseph Mingrone  *                                    |                               |
101ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
102ee67461eSJoseph Mingrone  *    |      Precise Origin Time Stamp Seconds                        |
103ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
104ee67461eSJoseph Mingrone  *    |                         Nano Seconds                          |
105ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
106ee67461eSJoseph Mingrone  *
107ee67461eSJoseph Mingrone  *  Delay Resp Message (msg type=0x9)
108ee67461eSJoseph Mingrone  *     0                   1                   2                   3
109ee67461eSJoseph Mingrone  *     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
110ee67461eSJoseph Mingrone  *                                    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
111ee67461eSJoseph Mingrone  *                                    |                               |
112ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
113ee67461eSJoseph Mingrone  *    |                            Seconds                            |
114ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
115ee67461eSJoseph Mingrone  *    |                         Nano Seconds                          |
116ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
117ee67461eSJoseph Mingrone  *    |          Port Identity        |
118ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
119ee67461eSJoseph Mingrone  *
120ee67461eSJoseph Mingrone  *  PDelay Request Message (msg type=0x2)
121ee67461eSJoseph Mingrone  *     0                   1                   2                   3
122ee67461eSJoseph Mingrone  *     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
123ee67461eSJoseph Mingrone  *                                    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
124ee67461eSJoseph Mingrone  *                                    |                               |
125ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
126ee67461eSJoseph Mingrone  *    |                    Origin Time Stamp Seconds                  |
127ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
128ee67461eSJoseph Mingrone  *    |                  Origin Time Stamp Nano Seconds               |
129ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
130ee67461eSJoseph Mingrone  *    |          Port Identity        |
131ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
132ee67461eSJoseph Mingrone  *
133ee67461eSJoseph Mingrone  *  PDelay Response Message (msg type=0x3)
134ee67461eSJoseph Mingrone  *     0                   1                   2                   3
135ee67461eSJoseph Mingrone  *     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
136ee67461eSJoseph Mingrone  *                                    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
137ee67461eSJoseph Mingrone  *                                    |                               |
138ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
139ee67461eSJoseph Mingrone  *    |     Request receipt Time Stamp Seconds                        |
140ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
141ee67461eSJoseph Mingrone  *    |                         Nano Seconds                          |
142ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
143ee67461eSJoseph Mingrone  *    | Requesting Port Identity      |
144ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
145ee67461eSJoseph Mingrone  *
146ee67461eSJoseph Mingrone  *  PDelay Resp Follow up Message (msg type=0xA)
147ee67461eSJoseph Mingrone  *     0                   1                   2                   3
148ee67461eSJoseph Mingrone  *     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
149ee67461eSJoseph Mingrone  *                                    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
150ee67461eSJoseph Mingrone  *                                    |                               |
151ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
152ee67461eSJoseph Mingrone  *    |      Response Origin Time Stamp Seconds                       |
153ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
154ee67461eSJoseph Mingrone  *    |                         Nano Seconds                          |
155ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
156ee67461eSJoseph Mingrone  *    | Requesting Port Identity      |
157ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
158ee67461eSJoseph Mingrone  *
159*0a7e5f1fSJoseph Mingrone  *  Signaling Message (msg type=0xC)
160ee67461eSJoseph Mingrone  *     0                   1                   2                   3
161ee67461eSJoseph Mingrone  *     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
162ee67461eSJoseph Mingrone  *                                    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
163ee67461eSJoseph Mingrone  *                                    | Requesting Port Identity      |
164ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
165ee67461eSJoseph Mingrone  *
166ee67461eSJoseph Mingrone  *  Management Message (msg type=0xD)
167ee67461eSJoseph Mingrone  *     0                   1                   2                   3
168ee67461eSJoseph Mingrone  *     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
169ee67461eSJoseph Mingrone  *                                    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
170ee67461eSJoseph Mingrone  *                                    | Requesting Port Identity      |
171ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
172ee67461eSJoseph Mingrone  *    |Start Bndry Hps| Boundary Hops | flags         | Reserved      |
173ee67461eSJoseph Mingrone  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
174ee67461eSJoseph Mingrone  *
175ee67461eSJoseph Mingrone  */
176ee67461eSJoseph Mingrone 
177ee67461eSJoseph Mingrone /* Values from IEEE1588-2008: 13.3.2.2 messageType (Enumeration4) */
178ee67461eSJoseph Mingrone #define M_SYNC                  0x0
179ee67461eSJoseph Mingrone #define M_DELAY_REQ             0x1
180ee67461eSJoseph Mingrone #define M_PDELAY_REQ            0x2
181ee67461eSJoseph Mingrone #define M_PDELAY_RESP           0x3
182ee67461eSJoseph Mingrone #define M_FOLLOW_UP             0x8
183ee67461eSJoseph Mingrone #define M_DELAY_RESP            0x9
184ee67461eSJoseph Mingrone #define M_PDELAY_RESP_FOLLOW_UP 0xA
185ee67461eSJoseph Mingrone #define M_ANNOUNCE              0xB
186*0a7e5f1fSJoseph Mingrone #define M_SIGNALING             0xC
187ee67461eSJoseph Mingrone #define M_MANAGEMENT            0xD
188ee67461eSJoseph Mingrone 
189ee67461eSJoseph Mingrone static const struct tok ptp_msg_type[] = {
190ee67461eSJoseph Mingrone     { M_SYNC, "sync msg"},
191ee67461eSJoseph Mingrone     { M_DELAY_REQ, "delay req msg"},
192ee67461eSJoseph Mingrone     { M_PDELAY_REQ, "peer delay req msg"},
193ee67461eSJoseph Mingrone     { M_PDELAY_RESP, "peer delay resp msg"},
194ee67461eSJoseph Mingrone     { M_FOLLOW_UP, "follow up msg"},
195ee67461eSJoseph Mingrone     { M_DELAY_RESP, "delay resp msg"},
196ee67461eSJoseph Mingrone     { M_PDELAY_RESP_FOLLOW_UP, "pdelay resp fup msg"},
197ee67461eSJoseph Mingrone     { M_ANNOUNCE, "announce msg"},
198*0a7e5f1fSJoseph Mingrone     { M_SIGNALING, "signaling msg"},
199ee67461eSJoseph Mingrone     { M_MANAGEMENT, "management msg"},
200ee67461eSJoseph Mingrone     { 0, NULL}
201ee67461eSJoseph Mingrone };
202ee67461eSJoseph Mingrone 
203ee67461eSJoseph Mingrone /* Values from IEEE1588-2008: 13.3.2.10 controlField (UInteger8) */
204ee67461eSJoseph Mingrone /*
205ee67461eSJoseph Mingrone  * The use of this field by the receiver is deprecated.
206ee67461eSJoseph Mingrone  * NOTE-This field is provided for compatibility with hardware designed
207ee67461eSJoseph Mingrone  * to conform to version 1 of this standard.
208ee67461eSJoseph Mingrone  */
209ee67461eSJoseph Mingrone #define C_SYNC              0x0
210ee67461eSJoseph Mingrone #define C_DELAY_REQ         0x1
211ee67461eSJoseph Mingrone #define C_FOLLOW_UP         0x2
212ee67461eSJoseph Mingrone #define C_DELAY_RESP        0x3
213ee67461eSJoseph Mingrone #define C_MANAGEMENT        0x4
214ee67461eSJoseph Mingrone #define C_OTHER             0x5
215ee67461eSJoseph Mingrone 
216ee67461eSJoseph Mingrone static const struct tok ptp_control_field[] = {
217ee67461eSJoseph Mingrone     { C_SYNC, "Sync"},
218ee67461eSJoseph Mingrone     { C_DELAY_REQ, "Delay_Req"},
219ee67461eSJoseph Mingrone     { C_FOLLOW_UP, "Follow_Up"},
220ee67461eSJoseph Mingrone     { C_DELAY_RESP, "Delay_Resp"},
221ee67461eSJoseph Mingrone     { C_MANAGEMENT, "Management"},
222ee67461eSJoseph Mingrone     { C_OTHER, "Other"},
223ee67461eSJoseph Mingrone     { 0, NULL}
224ee67461eSJoseph Mingrone };
225ee67461eSJoseph Mingrone 
226ee67461eSJoseph Mingrone #define PTP_TRUE 1
227ee67461eSJoseph Mingrone #define PTP_FALSE !PTP_TRUE
228ee67461eSJoseph Mingrone 
229ee67461eSJoseph Mingrone #define PTP_HDR_LEN         0x22
230ee67461eSJoseph Mingrone 
231ee67461eSJoseph Mingrone /* mask based on the first byte */
232*0a7e5f1fSJoseph Mingrone #define PTP_MAJOR_VERS_MASK 0x0F
233*0a7e5f1fSJoseph Mingrone #define PTP_MINOR_VERS_MASK 0xF0
234*0a7e5f1fSJoseph Mingrone #define PTP_MAJOR_SDO_ID_MASK   0xF0
235ee67461eSJoseph Mingrone #define PTP_MSG_TYPE_MASK   0x0F
236ee67461eSJoseph Mingrone 
237ee67461eSJoseph Mingrone /*mask based 2byte */
238ee67461eSJoseph Mingrone #define PTP_DOMAIN_MASK     0xFF00
239ee67461eSJoseph Mingrone #define PTP_RSVD1_MASK      0xFF
240ee67461eSJoseph Mingrone #define PTP_CONTROL_MASK    0xFF
241ee67461eSJoseph Mingrone #define PTP_LOGMSG_MASK     0xFF
242ee67461eSJoseph Mingrone 
243ee67461eSJoseph Mingrone /* mask based on the flags 2 bytes */
244ee67461eSJoseph Mingrone 
245ee67461eSJoseph Mingrone #define PTP_L161_MASK               0x1
246ee67461eSJoseph Mingrone #define PTP_L1_59_MASK              0x2
247ee67461eSJoseph Mingrone #define PTP_UTC_REASONABLE_MASK     0x4
248ee67461eSJoseph Mingrone #define PTP_TIMESCALE_MASK          0x8
249ee67461eSJoseph Mingrone #define PTP_TIME_TRACABLE_MASK      0x10
250ee67461eSJoseph Mingrone #define PTP_FREQUENCY_TRACABLE_MASK 0x20
251ee67461eSJoseph Mingrone #define PTP_ALTERNATE_MASTER_MASK   0x100
252ee67461eSJoseph Mingrone #define PTP_TWO_STEP_MASK           0x200
253ee67461eSJoseph Mingrone #define PTP_UNICAST_MASK            0x400
254ee67461eSJoseph Mingrone #define PTP_PROFILE_SPEC_1_MASK     0x1000
255ee67461eSJoseph Mingrone #define PTP_PROFILE_SPEC_2_MASK     0x2000
256ee67461eSJoseph Mingrone #define PTP_SECURITY_MASK           0x4000
257ee67461eSJoseph Mingrone #define PTP_FLAGS_UNKNOWN_MASK      0x18C0
258ee67461eSJoseph Mingrone 
259ee67461eSJoseph Mingrone static const struct tok ptp_flag_values[] = {
260ee67461eSJoseph Mingrone     { PTP_L161_MASK, "l1 61"},
261ee67461eSJoseph Mingrone     { PTP_L1_59_MASK, "l1 59"},
262ee67461eSJoseph Mingrone     { PTP_UTC_REASONABLE_MASK, "utc reasonable"},
263ee67461eSJoseph Mingrone     { PTP_TIMESCALE_MASK, "timescale"},
264ee67461eSJoseph Mingrone     { PTP_TIME_TRACABLE_MASK, "time tracable"},
265ee67461eSJoseph Mingrone     { PTP_FREQUENCY_TRACABLE_MASK, "frequency tracable"},
266ee67461eSJoseph Mingrone     { PTP_ALTERNATE_MASTER_MASK, "alternate master"},
267ee67461eSJoseph Mingrone     { PTP_TWO_STEP_MASK, "two step"},
268ee67461eSJoseph Mingrone     { PTP_UNICAST_MASK, "unicast"},
269ee67461eSJoseph Mingrone     { PTP_PROFILE_SPEC_1_MASK, "profile specific 1"},
270ee67461eSJoseph Mingrone     { PTP_PROFILE_SPEC_2_MASK, "profile specific 2"},
271ee67461eSJoseph Mingrone     { PTP_SECURITY_MASK, "security mask"},
272ee67461eSJoseph Mingrone     { PTP_FLAGS_UNKNOWN_MASK,  "unknown"},
273ee67461eSJoseph Mingrone     {0, NULL}
274ee67461eSJoseph Mingrone };
275ee67461eSJoseph Mingrone 
276ee67461eSJoseph Mingrone static const char *p_porigin_ts = "preciseOriginTimeStamp";
277ee67461eSJoseph Mingrone static const char *p_origin_ts = "originTimeStamp";
278ee67461eSJoseph Mingrone static const char *p_recv_ts = "receiveTimeStamp";
279ee67461eSJoseph Mingrone 
280ee67461eSJoseph Mingrone #define PTP_VER_1 0x1
281ee67461eSJoseph Mingrone #define PTP_VER_2 0x2
282ee67461eSJoseph Mingrone 
283ee67461eSJoseph Mingrone #define PTP_UCHAR_LEN  sizeof(uint8_t)
284ee67461eSJoseph Mingrone #define PTP_UINT16_LEN sizeof(uint16_t)
285ee67461eSJoseph Mingrone #define PTP_UINT32_LEN sizeof(uint32_t)
286ee67461eSJoseph Mingrone #define PTP_6BYTES_LEN sizeof(uint32_t)+sizeof(uint16_t)
287ee67461eSJoseph Mingrone #define PTP_UINT64_LEN sizeof(uint64_t)
288ee67461eSJoseph Mingrone 
289ee67461eSJoseph Mingrone static void ptp_print_1(netdissect_options *ndo);
290ee67461eSJoseph Mingrone static void ptp_print_2(netdissect_options *ndo, const u_char *bp, u_int len);
291ee67461eSJoseph Mingrone 
292ee67461eSJoseph Mingrone static void ptp_print_timestamp(netdissect_options *ndo, const u_char *bp, u_int *len, const char *stype);
293ee67461eSJoseph Mingrone static void ptp_print_timestamp_identity(netdissect_options *ndo, const u_char *bp, u_int *len, const char *ttype);
294ee67461eSJoseph Mingrone static void ptp_print_announce_msg(netdissect_options *ndo, const u_char *bp, u_int *len);
295ee67461eSJoseph Mingrone static void ptp_print_port_id(netdissect_options *ndo, const u_char *bp, u_int *len);
296ee67461eSJoseph Mingrone static void ptp_print_mgmt_msg(netdissect_options *ndo, const u_char *bp, u_int *len);
297ee67461eSJoseph Mingrone 
298ee67461eSJoseph Mingrone static void
print_field(netdissect_options * ndo,const char * st,uint32_t flen,const u_char * bp,u_int * len,uint8_t hex)299ee67461eSJoseph Mingrone print_field(netdissect_options *ndo, const char *st, uint32_t flen,
300ee67461eSJoseph Mingrone             const u_char *bp, u_int *len, uint8_t hex)
301ee67461eSJoseph Mingrone {
302ee67461eSJoseph Mingrone     uint8_t u8_val;
303ee67461eSJoseph Mingrone     uint16_t u16_val;
304ee67461eSJoseph Mingrone     uint32_t u32_val;
305ee67461eSJoseph Mingrone     uint64_t u64_val;
306ee67461eSJoseph Mingrone 
307ee67461eSJoseph Mingrone     switch(flen) {
308ee67461eSJoseph Mingrone         case PTP_UCHAR_LEN:
309ee67461eSJoseph Mingrone             u8_val = GET_U_1(bp);
310ee67461eSJoseph Mingrone             ND_PRINT(", %s", st);
311ee67461eSJoseph Mingrone             if (hex)
312ee67461eSJoseph Mingrone                 ND_PRINT(" 0x%x", u8_val);
313ee67461eSJoseph Mingrone             else
314ee67461eSJoseph Mingrone                 ND_PRINT(" %u", u8_val);
315ee67461eSJoseph Mingrone             *len -= 1; bp += 1;
316ee67461eSJoseph Mingrone             break;
317ee67461eSJoseph Mingrone         case PTP_UINT16_LEN:
318ee67461eSJoseph Mingrone             u16_val = GET_BE_U_2(bp);
319ee67461eSJoseph Mingrone             ND_PRINT(", %s", st);
320ee67461eSJoseph Mingrone             if (hex)
321ee67461eSJoseph Mingrone                 ND_PRINT(" 0x%x", u16_val);
322ee67461eSJoseph Mingrone             else
323ee67461eSJoseph Mingrone                 ND_PRINT(" %u", u16_val);
324ee67461eSJoseph Mingrone             *len -= 2; bp += 2;
325ee67461eSJoseph Mingrone             break;
326ee67461eSJoseph Mingrone         case PTP_UINT32_LEN:
327ee67461eSJoseph Mingrone             u32_val = GET_BE_U_4(bp);
328ee67461eSJoseph Mingrone             ND_PRINT(", %s", st);
329ee67461eSJoseph Mingrone             if (hex)
330ee67461eSJoseph Mingrone                 ND_PRINT(" 0x%x", u32_val);
331ee67461eSJoseph Mingrone             else
332ee67461eSJoseph Mingrone                 ND_PRINT(" %u", u32_val);
333ee67461eSJoseph Mingrone             *len -= 4; bp += 4;
334ee67461eSJoseph Mingrone             break;
335ee67461eSJoseph Mingrone         case PTP_UINT64_LEN:
336ee67461eSJoseph Mingrone             u64_val = GET_BE_U_8(bp);
337ee67461eSJoseph Mingrone             ND_PRINT(", %s", st);
338ee67461eSJoseph Mingrone             if (hex)
339ee67461eSJoseph Mingrone                 ND_PRINT(" 0x%"PRIx64, u64_val);
340ee67461eSJoseph Mingrone             else
341ee67461eSJoseph Mingrone                 ND_PRINT(" 0x%"PRIu64, u64_val);
342ee67461eSJoseph Mingrone             *len -= 8; bp += 8;
343ee67461eSJoseph Mingrone             break;
344ee67461eSJoseph Mingrone         default:
345ee67461eSJoseph Mingrone             break;
346ee67461eSJoseph Mingrone     }
347ee67461eSJoseph Mingrone }
348ee67461eSJoseph Mingrone 
349ee67461eSJoseph Mingrone static void
ptp_print_1(netdissect_options * ndo)350ee67461eSJoseph Mingrone ptp_print_1(netdissect_options *ndo)
351ee67461eSJoseph Mingrone {
352ee67461eSJoseph Mingrone     ND_PRINT(" (not implemented)");
353ee67461eSJoseph Mingrone }
354ee67461eSJoseph Mingrone 
355ee67461eSJoseph Mingrone static void
ptp_print_2(netdissect_options * ndo,const u_char * bp,u_int length)356ee67461eSJoseph Mingrone ptp_print_2(netdissect_options *ndo, const u_char *bp, u_int length)
357ee67461eSJoseph Mingrone {
358ee67461eSJoseph Mingrone     u_int len = length;
359ee67461eSJoseph Mingrone     uint16_t msg_len, flags, port_id, seq_id;
360*0a7e5f1fSJoseph Mingrone     uint8_t foct, domain_no, msg_type, major_sdo_id, rsvd1, lm_int, control;
361ee67461eSJoseph Mingrone     uint64_t ns_corr;
362ee67461eSJoseph Mingrone     uint16_t sns_corr;
363ee67461eSJoseph Mingrone     uint32_t rsvd2;
364ee67461eSJoseph Mingrone     uint64_t clk_id;
365ee67461eSJoseph Mingrone 
366ee67461eSJoseph Mingrone     foct = GET_U_1(bp);
367*0a7e5f1fSJoseph Mingrone     major_sdo_id = (foct & PTP_MAJOR_SDO_ID_MASK) >> 4;
368*0a7e5f1fSJoseph Mingrone     ND_PRINT(", majorSdoId : 0x%x", major_sdo_id);
369ee67461eSJoseph Mingrone     msg_type = foct & PTP_MSG_TYPE_MASK;
370ee67461eSJoseph Mingrone     ND_PRINT(", msg type : %s", tok2str(ptp_msg_type, "Reserved", msg_type));
371ee67461eSJoseph Mingrone 
372ee67461eSJoseph Mingrone     /* msg length */
373ee67461eSJoseph Mingrone     len -= 2; bp += 2; msg_len = GET_BE_U_2(bp); ND_PRINT(", length : %u", msg_len);
374ee67461eSJoseph Mingrone 
375ee67461eSJoseph Mingrone     /* domain */
376ee67461eSJoseph Mingrone     len -= 2; bp += 2; domain_no = (GET_BE_U_2(bp) & PTP_DOMAIN_MASK) >> 8; ND_PRINT(", domain : %u", domain_no);
377ee67461eSJoseph Mingrone 
378ee67461eSJoseph Mingrone     /* rsvd 1*/
379ee67461eSJoseph Mingrone     rsvd1 = GET_BE_U_2(bp) & PTP_RSVD1_MASK;
380ee67461eSJoseph Mingrone     ND_PRINT(", reserved1 : %u", rsvd1);
381ee67461eSJoseph Mingrone 
382ee67461eSJoseph Mingrone     /* flags */
383ee67461eSJoseph Mingrone     len -= 2; bp += 2; flags = GET_BE_U_2(bp); ND_PRINT(", Flags [%s]", bittok2str(ptp_flag_values, "none", flags));
384ee67461eSJoseph Mingrone 
385ee67461eSJoseph Mingrone     /* correction NS (48 bits) */
386ee67461eSJoseph Mingrone     len -= 2; bp += 2; ns_corr = GET_BE_U_6(bp); ND_PRINT(", NS correction : %"PRIu64, ns_corr);
387ee67461eSJoseph Mingrone 
388ee67461eSJoseph Mingrone     /* correction sub NS (16 bits) */
389ee67461eSJoseph Mingrone     len -= 6; bp += 6; sns_corr = GET_BE_U_2(bp); ND_PRINT(", sub NS correction : %u", sns_corr);
390ee67461eSJoseph Mingrone 
391ee67461eSJoseph Mingrone     /* Reserved 2 */
392ee67461eSJoseph Mingrone     len -= 2; bp += 2; rsvd2 = GET_BE_U_4(bp); ND_PRINT(", reserved2 : %u", rsvd2);
393ee67461eSJoseph Mingrone 
394ee67461eSJoseph Mingrone     /* clock identity */
395ee67461eSJoseph Mingrone     len -= 4; bp += 4; clk_id = GET_BE_U_8(bp); ND_PRINT(", clock identity : 0x%"PRIx64, clk_id);
396ee67461eSJoseph Mingrone 
397ee67461eSJoseph Mingrone     /* port identity */
398ee67461eSJoseph Mingrone     len -= 8; bp += 8; port_id = GET_BE_U_2(bp); ND_PRINT(", port id : %u", port_id);
399ee67461eSJoseph Mingrone 
400ee67461eSJoseph Mingrone     /* sequence ID */
401ee67461eSJoseph Mingrone     len -= 2; bp += 2; seq_id = GET_BE_U_2(bp); ND_PRINT(", seq id : %u", seq_id);
402ee67461eSJoseph Mingrone 
403ee67461eSJoseph Mingrone     /* control */
404ee67461eSJoseph Mingrone     len -= 2; bp += 2; control = GET_U_1(bp) ;
405ee67461eSJoseph Mingrone     ND_PRINT(", control : %u (%s)", control, tok2str(ptp_control_field, "Reserved", control));
406ee67461eSJoseph Mingrone 
407ee67461eSJoseph Mingrone     /* log message interval */
408ee67461eSJoseph Mingrone     lm_int = GET_BE_U_2(bp) & PTP_LOGMSG_MASK; ND_PRINT(", log message interval : %u", lm_int); len -= 2; bp += 2;
409ee67461eSJoseph Mingrone 
410ee67461eSJoseph Mingrone     switch(msg_type) {
411ee67461eSJoseph Mingrone         case M_SYNC:
412ee67461eSJoseph Mingrone             ptp_print_timestamp(ndo, bp, &len, p_origin_ts);
413ee67461eSJoseph Mingrone             break;
414ee67461eSJoseph Mingrone         case M_DELAY_REQ:
415ee67461eSJoseph Mingrone             ptp_print_timestamp(ndo, bp, &len, p_origin_ts);
416ee67461eSJoseph Mingrone             break;
417ee67461eSJoseph Mingrone         case M_PDELAY_REQ:
418ee67461eSJoseph Mingrone             ptp_print_timestamp_identity(ndo, bp, &len, p_porigin_ts);
419ee67461eSJoseph Mingrone             break;
420ee67461eSJoseph Mingrone         case M_PDELAY_RESP:
421ee67461eSJoseph Mingrone             ptp_print_timestamp_identity(ndo, bp, &len, p_recv_ts);
422ee67461eSJoseph Mingrone             break;
423ee67461eSJoseph Mingrone         case M_FOLLOW_UP:
424ee67461eSJoseph Mingrone             ptp_print_timestamp(ndo, bp, &len, p_porigin_ts);
425ee67461eSJoseph Mingrone             break;
426ee67461eSJoseph Mingrone         case M_DELAY_RESP:
427ee67461eSJoseph Mingrone             ptp_print_timestamp_identity(ndo, bp, &len, p_recv_ts);
428ee67461eSJoseph Mingrone             break;
429ee67461eSJoseph Mingrone         case M_PDELAY_RESP_FOLLOW_UP:
430ee67461eSJoseph Mingrone             ptp_print_timestamp_identity(ndo, bp, &len, p_porigin_ts);
431ee67461eSJoseph Mingrone             break;
432ee67461eSJoseph Mingrone         case M_ANNOUNCE:
433ee67461eSJoseph Mingrone             ptp_print_announce_msg(ndo, bp, &len);
434ee67461eSJoseph Mingrone             break;
435*0a7e5f1fSJoseph Mingrone         case M_SIGNALING:
436ee67461eSJoseph Mingrone             ptp_print_port_id(ndo, bp, &len);
437ee67461eSJoseph Mingrone             break;
438ee67461eSJoseph Mingrone         case M_MANAGEMENT:
439ee67461eSJoseph Mingrone             ptp_print_mgmt_msg(ndo, bp, &len);
440ee67461eSJoseph Mingrone             break;
441ee67461eSJoseph Mingrone         default:
442ee67461eSJoseph Mingrone             break;
443ee67461eSJoseph Mingrone     }
444ee67461eSJoseph Mingrone }
445ee67461eSJoseph Mingrone /*
446ee67461eSJoseph Mingrone  * PTP general message
447ee67461eSJoseph Mingrone  */
448ee67461eSJoseph Mingrone void
ptp_print(netdissect_options * ndo,const u_char * bp,u_int length)449ee67461eSJoseph Mingrone ptp_print(netdissect_options *ndo, const u_char *bp, u_int length)
450ee67461eSJoseph Mingrone {
451*0a7e5f1fSJoseph Mingrone     u_int major_vers;
452*0a7e5f1fSJoseph Mingrone     u_int minor_vers;
453ee67461eSJoseph Mingrone 
454*0a7e5f1fSJoseph Mingrone     /* In 1588-2019, a minorVersionPTP field has been created in the common PTP
455*0a7e5f1fSJoseph Mingrone      * message header, from a previously reserved field. Implementations
456*0a7e5f1fSJoseph Mingrone      * compatible to the 2019 edition shall indicate a versionPTP field value
457*0a7e5f1fSJoseph Mingrone      * of 2 and minorVersionPTP field value of 1, indicating that this is PTP
458*0a7e5f1fSJoseph Mingrone      * version 2.1.
459*0a7e5f1fSJoseph Mingrone      */
460ee67461eSJoseph Mingrone     ndo->ndo_protocol = "ptp";
461*0a7e5f1fSJoseph Mingrone     ND_ICHECK_U(length, <, PTP_HDR_LEN);
462*0a7e5f1fSJoseph Mingrone     major_vers = GET_BE_U_2(bp) & PTP_MAJOR_VERS_MASK;
463*0a7e5f1fSJoseph Mingrone     minor_vers = (GET_BE_U_2(bp) & PTP_MINOR_VERS_MASK) >> 4;
464*0a7e5f1fSJoseph Mingrone     if (minor_vers)
465*0a7e5f1fSJoseph Mingrone 	    ND_PRINT("PTPv%u.%u", major_vers, minor_vers);
466*0a7e5f1fSJoseph Mingrone     else
467*0a7e5f1fSJoseph Mingrone 	    ND_PRINT("PTPv%u", major_vers);
468*0a7e5f1fSJoseph Mingrone 
469*0a7e5f1fSJoseph Mingrone     switch(major_vers) {
470ee67461eSJoseph Mingrone         case PTP_VER_1:
471ee67461eSJoseph Mingrone             ptp_print_1(ndo);
472ee67461eSJoseph Mingrone             break;
473ee67461eSJoseph Mingrone         case PTP_VER_2:
474ee67461eSJoseph Mingrone             ptp_print_2(ndo, bp, length);
475ee67461eSJoseph Mingrone             break;
476ee67461eSJoseph Mingrone         default:
477ee67461eSJoseph Mingrone             //ND_PRINT("ERROR: unknown-version\n");
478ee67461eSJoseph Mingrone             break;
479ee67461eSJoseph Mingrone     }
480ee67461eSJoseph Mingrone     return;
481ee67461eSJoseph Mingrone 
482ee67461eSJoseph Mingrone invalid:
483ee67461eSJoseph Mingrone     nd_print_invalid(ndo);
484ee67461eSJoseph Mingrone }
485ee67461eSJoseph Mingrone 
486ee67461eSJoseph Mingrone static void
ptp_print_timestamp(netdissect_options * ndo,const u_char * bp,u_int * len,const char * stype)487ee67461eSJoseph Mingrone ptp_print_timestamp(netdissect_options *ndo, const u_char *bp, u_int *len, const char *stype)
488ee67461eSJoseph Mingrone {
489ee67461eSJoseph Mingrone     uint64_t secs;
490ee67461eSJoseph Mingrone     uint32_t nsecs;
491ee67461eSJoseph Mingrone 
492ee67461eSJoseph Mingrone     ND_PRINT(", %s :", stype);
493ee67461eSJoseph Mingrone     /* sec time stamp 6 bytes */
494ee67461eSJoseph Mingrone     secs = GET_BE_U_6(bp);
495ee67461eSJoseph Mingrone     ND_PRINT(" %"PRIu64" seconds,", secs);
496ee67461eSJoseph Mingrone     *len -= 6;
497ee67461eSJoseph Mingrone     bp += 6;
498ee67461eSJoseph Mingrone 
499ee67461eSJoseph Mingrone     /* NS time stamp 4 bytes */
500ee67461eSJoseph Mingrone     nsecs = GET_BE_U_4(bp);
501ee67461eSJoseph Mingrone     ND_PRINT(" %u nanoseconds", nsecs);
502ee67461eSJoseph Mingrone     *len -= 4;
503ee67461eSJoseph Mingrone     bp += 4;
504ee67461eSJoseph Mingrone }
505ee67461eSJoseph Mingrone static void
ptp_print_timestamp_identity(netdissect_options * ndo,const u_char * bp,u_int * len,const char * ttype)506ee67461eSJoseph Mingrone ptp_print_timestamp_identity(netdissect_options *ndo,
507ee67461eSJoseph Mingrone                             const u_char *bp, u_int *len, const char *ttype)
508ee67461eSJoseph Mingrone {
509ee67461eSJoseph Mingrone     uint64_t secs;
510ee67461eSJoseph Mingrone     uint32_t nsecs;
511ee67461eSJoseph Mingrone     uint16_t port_id;
512ee67461eSJoseph Mingrone     uint64_t port_identity;
513ee67461eSJoseph Mingrone 
514ee67461eSJoseph Mingrone     ND_PRINT(", %s :", ttype);
515ee67461eSJoseph Mingrone     /* sec time stamp 6 bytes */
516ee67461eSJoseph Mingrone     secs = GET_BE_U_6(bp);
517ee67461eSJoseph Mingrone     ND_PRINT(" %"PRIu64" seconds,", secs);
518ee67461eSJoseph Mingrone     *len -= 6;
519ee67461eSJoseph Mingrone     bp += 6;
520ee67461eSJoseph Mingrone 
521ee67461eSJoseph Mingrone     /* NS time stamp 4 bytes */
522ee67461eSJoseph Mingrone     nsecs = GET_BE_U_4(bp);
523ee67461eSJoseph Mingrone     ND_PRINT(" %u nanoseconds", nsecs);
524ee67461eSJoseph Mingrone     *len -= 4;
525ee67461eSJoseph Mingrone     bp += 4;
526ee67461eSJoseph Mingrone 
527ee67461eSJoseph Mingrone     /* port identity*/
528ee67461eSJoseph Mingrone     port_identity = GET_BE_U_8(bp);
529ee67461eSJoseph Mingrone     ND_PRINT(", port identity : 0x%"PRIx64, port_identity);
530ee67461eSJoseph Mingrone     *len -= 8;
531ee67461eSJoseph Mingrone     bp += 8;
532ee67461eSJoseph Mingrone 
533ee67461eSJoseph Mingrone     /* port id */
534ee67461eSJoseph Mingrone     port_id = GET_BE_U_2(bp);
535ee67461eSJoseph Mingrone     ND_PRINT(", port id : %u", port_id);
536ee67461eSJoseph Mingrone     *len -= 2;
537ee67461eSJoseph Mingrone     bp += 2;
538ee67461eSJoseph Mingrone }
539ee67461eSJoseph Mingrone static void
ptp_print_announce_msg(netdissect_options * ndo,const u_char * bp,u_int * len)540ee67461eSJoseph Mingrone ptp_print_announce_msg(netdissect_options *ndo, const u_char *bp, u_int *len)
541ee67461eSJoseph Mingrone {
542ee67461eSJoseph Mingrone     uint8_t rsvd, gm_prio_1, gm_prio_2, gm_clk_cls, gm_clk_acc, time_src;
543ee67461eSJoseph Mingrone     uint16_t origin_cur_utc, gm_clk_var, steps_removed;
544ee67461eSJoseph Mingrone     uint64_t gm_clock_id;
545ee67461eSJoseph Mingrone     uint64_t secs;
546ee67461eSJoseph Mingrone     uint32_t nsecs;
547ee67461eSJoseph Mingrone 
548ee67461eSJoseph Mingrone     ND_PRINT(", %s :", p_origin_ts);
549ee67461eSJoseph Mingrone     /* sec time stamp 6 bytes */
550ee67461eSJoseph Mingrone     secs = GET_BE_U_6(bp);
551ee67461eSJoseph Mingrone     ND_PRINT(" %"PRIu64" seconds", secs);
552ee67461eSJoseph Mingrone     *len -= 6;
553ee67461eSJoseph Mingrone     bp += 6;
554ee67461eSJoseph Mingrone 
555ee67461eSJoseph Mingrone     /* NS time stamp 4 bytes */
556ee67461eSJoseph Mingrone     nsecs = GET_BE_U_4(bp);
557ee67461eSJoseph Mingrone     ND_PRINT(" %u nanoseconds", nsecs);
558ee67461eSJoseph Mingrone     *len -= 4;
559ee67461eSJoseph Mingrone     bp += 4;
560ee67461eSJoseph Mingrone 
561ee67461eSJoseph Mingrone     /* origin cur utc */
562ee67461eSJoseph Mingrone     origin_cur_utc = GET_BE_U_2(bp);
563ee67461eSJoseph Mingrone     ND_PRINT(", origin cur utc :%u", origin_cur_utc);
564ee67461eSJoseph Mingrone     *len -= 2;
565ee67461eSJoseph Mingrone     bp += 2;
566ee67461eSJoseph Mingrone 
567ee67461eSJoseph Mingrone     /* rsvd */
568ee67461eSJoseph Mingrone     rsvd = GET_U_1(bp);
569ee67461eSJoseph Mingrone     ND_PRINT(", rsvd : %u", rsvd);
570ee67461eSJoseph Mingrone     *len -= 1;
571ee67461eSJoseph Mingrone     bp += 1;
572ee67461eSJoseph Mingrone 
573ee67461eSJoseph Mingrone     /* gm prio */
574ee67461eSJoseph Mingrone     gm_prio_1 = GET_U_1(bp);
575ee67461eSJoseph Mingrone     ND_PRINT(", gm priority_1 : %u", gm_prio_1);
576ee67461eSJoseph Mingrone     *len -= 1;
577ee67461eSJoseph Mingrone     bp += 1;
578ee67461eSJoseph Mingrone 
579ee67461eSJoseph Mingrone     /* GM clock class */
580ee67461eSJoseph Mingrone     gm_clk_cls = GET_U_1(bp);
581ee67461eSJoseph Mingrone     ND_PRINT(", gm clock class : %u", gm_clk_cls);
582ee67461eSJoseph Mingrone     *len -= 1;
583ee67461eSJoseph Mingrone     bp += 1;
584ee67461eSJoseph Mingrone     /* GM clock accuracy */
585ee67461eSJoseph Mingrone     gm_clk_acc = GET_U_1(bp);
586ee67461eSJoseph Mingrone     ND_PRINT(", gm clock accuracy : %u", gm_clk_acc);
587ee67461eSJoseph Mingrone     *len -= 1;
588ee67461eSJoseph Mingrone     bp += 1;
589ee67461eSJoseph Mingrone     /* GM clock variance */
590ee67461eSJoseph Mingrone     gm_clk_var = GET_BE_U_2(bp);
591ee67461eSJoseph Mingrone     ND_PRINT(", gm clock variance : %u", gm_clk_var);
592ee67461eSJoseph Mingrone     *len -= 2;
593ee67461eSJoseph Mingrone     bp += 2;
594ee67461eSJoseph Mingrone     /* GM Prio 2 */
595ee67461eSJoseph Mingrone     gm_prio_2 = GET_U_1(bp);
596ee67461eSJoseph Mingrone     ND_PRINT(", gm priority_2 : %u", gm_prio_2);
597ee67461eSJoseph Mingrone     *len -= 1;
598ee67461eSJoseph Mingrone     bp += 1;
599ee67461eSJoseph Mingrone 
600ee67461eSJoseph Mingrone     /* GM Clock Identity */
601ee67461eSJoseph Mingrone     gm_clock_id = GET_BE_U_8(bp);
602ee67461eSJoseph Mingrone     ND_PRINT(", gm clock id : 0x%"PRIx64, gm_clock_id);
603ee67461eSJoseph Mingrone     *len -= 8;
604ee67461eSJoseph Mingrone     bp += 8;
605ee67461eSJoseph Mingrone     /* steps removed */
606ee67461eSJoseph Mingrone     steps_removed = GET_BE_U_2(bp);
607ee67461eSJoseph Mingrone     ND_PRINT(", steps removed : %u", steps_removed);
608ee67461eSJoseph Mingrone     *len -= 2;
609ee67461eSJoseph Mingrone     bp += 2;
610ee67461eSJoseph Mingrone     /* Time source */
611ee67461eSJoseph Mingrone     time_src = GET_U_1(bp);
612ee67461eSJoseph Mingrone     ND_PRINT(", time source : 0x%x", time_src);
613ee67461eSJoseph Mingrone     *len -= 1;
614ee67461eSJoseph Mingrone     bp += 1;
615ee67461eSJoseph Mingrone 
616ee67461eSJoseph Mingrone }
617ee67461eSJoseph Mingrone static void
ptp_print_port_id(netdissect_options * ndo,const u_char * bp,u_int * len)618ee67461eSJoseph Mingrone ptp_print_port_id(netdissect_options *ndo, const u_char *bp, u_int *len)
619ee67461eSJoseph Mingrone {
620ee67461eSJoseph Mingrone     uint16_t port_id;
621ee67461eSJoseph Mingrone     uint64_t port_identity;
622ee67461eSJoseph Mingrone 
623ee67461eSJoseph Mingrone     /* port identity*/
624ee67461eSJoseph Mingrone     port_identity = GET_BE_U_8(bp);
625ee67461eSJoseph Mingrone     ND_PRINT(", port identity : 0x%"PRIx64, port_identity);
626ee67461eSJoseph Mingrone     *len -= 8;
627ee67461eSJoseph Mingrone     bp += 8;
628ee67461eSJoseph Mingrone 
629ee67461eSJoseph Mingrone     /* port id */
630ee67461eSJoseph Mingrone     port_id = GET_BE_U_2(bp);
631ee67461eSJoseph Mingrone     ND_PRINT(", port id : %u", port_id);
632ee67461eSJoseph Mingrone     *len -= 2;
633ee67461eSJoseph Mingrone     bp += 2;
634ee67461eSJoseph Mingrone 
635ee67461eSJoseph Mingrone }
636ee67461eSJoseph Mingrone 
637ee67461eSJoseph Mingrone static void
ptp_print_mgmt_msg(netdissect_options * ndo,const u_char * bp,u_int * len)638ee67461eSJoseph Mingrone ptp_print_mgmt_msg(netdissect_options *ndo, const u_char *bp, u_int *len)
639ee67461eSJoseph Mingrone {
640ee67461eSJoseph Mingrone     ptp_print_port_id(ndo, bp, len);
641ee67461eSJoseph Mingrone     print_field(ndo, ", start boundary hops ", PTP_UCHAR_LEN, bp, len, PTP_FALSE);
642ee67461eSJoseph Mingrone     print_field(ndo, ", boundary hops ", PTP_UCHAR_LEN, bp, len, PTP_FALSE);
643ee67461eSJoseph Mingrone     print_field(ndo, ", flags ", PTP_UCHAR_LEN, bp, len, PTP_TRUE);
644ee67461eSJoseph Mingrone     print_field(ndo, ", reserved ", PTP_UCHAR_LEN, bp, len, PTP_TRUE);
645ee67461eSJoseph Mingrone }
646