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