2 * Routines for PTP (Precision Time Protocol) dissection
3 * Copyright 2004, Auges Tchouante <tchouante2001@yahoo.fr>
4 * Copyright 2004, Dominic Béchaz <bdo@zhwin.ch> , ZHW/InES
5 * Copyright 2004, Markus Seehofer <mseehofe@nt.hirschmann.de>
9 * Ethereal - Network traffic analyzer
10 * By Gerald Combs <gerald@ethereal.com>
11 * Copyright 1998 Gerald Combs
13 * This program is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU General Public License
15 * as published by the Free Software Foundation; either version 2
16 * of the License, or (at your option) any later version.
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
23 * You should have received a copy of the GNU General Public License
24 * along with this program; if not, write to the Free Software
25 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
38 #ifdef NEED_SNPRINTF_H
39 # include "snprintf.h"
42 #include <epan/packet.h>
45 /**********************************************************/
46 /* Port definition's for PTP */
47 /**********************************************************/
48 #define EVENT_PORT_PTP 319
49 #define GENERAL_PORT_PTP 320
51 /*END Port definition's for PTP*/
53 /**********************************************************/
54 /* Offsets of fields within a PTP packet. */
55 /**********************************************************/
57 /*Common offsets for all Messages (Synch, Delay_Req, Follow_Up, Delay_Resp ....)*/
58 #define PTP_VERSIONPTP_OFFSET 0
59 #define PTP_VERSIONNETWORK_OFFSET 2
60 #define PTP_SUBDOMAIN_OFFSET 4
61 #define PTP_MESSAGETYPE_OFFSET 20
62 #define PTP_SOURCECOMMUNICATIONTECHNOLOGY_OFFSET 21
63 #define PTP_SOURCEUUID_OFFSET 22
64 #define PTP_SOURCEPORTID_OFFSET 28
65 #define PTP_SEQUENCEID_OFFSET 30
66 #define PTP_CONTROL_OFFSET 32
67 #define PTP_FLAGS_OFFSET 34
68 #define PTP_FLAGS_LI61_OFFSET 34
69 #define PTP_FLAGS_LI59_OFFSET 34
70 #define PTP_FLAGS_BOUNDARY_CLOCK_OFFSET 34
71 #define PTP_FLAGS_ASSIST_OFFSET 34
72 #define PTP_FLAGS_EXT_SYNC_OFFSET 34
73 #define PTP_FLAGS_PARENT_STATS_OFFSET 34
74 #define PTP_FLAGS_SYNC_BURST_OFFSET 34
76 /*Offsets for PTP_Sync and Delay_Req (=SDR) messages*/
77 #define PTP_SDR_ORIGINTIMESTAMP_OFFSET 40
78 #define PTP_SDR_ORIGINTIMESTAMP_SECONDS_OFFSET 40
79 #define PTP_SDR_ORIGINTIMESTAMP_NANOSECONDS_OFFSET 44
80 #define PTP_SDR_EPOCHNUMBER_OFFSET 48
81 #define PTP_SDR_CURRENTUTCOFFSET_OFFSET 50
82 #define PTP_SDR_GRANDMASTERCOMMUNICATIONTECHNOLOGY_OFFSET 53
83 #define PTP_SDR_GRANDMASTERCLOCKUUID_OFFSET 54
84 #define PTP_SDR_GRANDMASTERPORTID_OFFSET 60
85 #define PTP_SDR_GRANDMASTERSEQUENCEID_OFFSET 62
86 #define PTP_SDR_GRANDMASTERCLOCKSTRATUM_OFFSET 67
87 #define PTP_SDR_GRANDMASTERCLOCKIDENTIFIER_OFFSET 68
88 #define PTP_SDR_GRANDMASTERCLOCKVARIANCE_OFFSET 74
89 #define PTP_SDR_GRANDMASTERPREFERRED_OFFSET 77
90 #define PTP_SDR_GRANDMASTERISBOUNDARYCLOCK_OFFSET 79
91 #define PTP_SDR_SYNCINTERVAL_OFFSET 83
92 #define PTP_SDR_LOCALCLOCKVARIANCE_OFFSET 86
93 #define PTP_SDR_LOCALSTEPSREMOVED_OFFSET 90
94 #define PTP_SDR_LOCALCLOCKSTRATUM_OFFSET 95
95 #define PTP_SDR_LOCALCLOCKIDENTIFIER_OFFSET 96
96 #define PTP_SDR_PARENTCOMMUNICATIONTECHNOLOGY_OFFSET 101
97 #define PTP_SDR_PARENTUUID_OFFSET 102
98 #define PTP_SDR_PARENTPORTFIELD_OFFSET 110
99 #define PTP_SDR_ESTIMATEDMASTERVARIANCE_OFFSET 114
100 #define PTP_SDR_ESTIMATEDMASTERDRIFT_OFFSET 116
101 #define PTP_SDR_UTCREASONABLE_OFFSET 123
103 /*Offsets for Follow_Up (=FU) messages*/
104 #define PTP_FU_ASSOCIATEDSEQUENCEID_OFFSET 42
105 #define PTP_FU_PRECISEORIGINTIMESTAMP_OFFSET 44
106 #define PTP_FU_PRECISEORIGINTIMESTAMP_SECONDS_OFFSET 44
107 #define PTP_FU_PRECISEORIGINTIMESTAMP_NANOSECONDS_OFFSET 48
109 /*Offsets for Delay_Resp (=DR) messages*/
110 #define PTP_DR_DELAYRECEIPTTIMESTAMP_OFFSET 40
111 #define PTP_DR_DELAYRECEIPTTIMESTAMP_SECONDS_OFFSET 40
112 #define PTP_DR_DELAYRECEIPTTIMESTAMP_NANOSECONDS_OFFSET 44
113 #define PTP_DR_REQUESTINGSOURCECOMMUNICATIONTECHNOLOGY_OFFSET 49
114 #define PTP_DR_REQUESTINGSOURCEUUID_OFFSET 50
115 #define PTP_DR_REQUESTINGSOURCEPORTID_OFFSET 56
116 #define PTP_DR_REQUESTINGSOURCESEQUENCEID_OFFSET 58
118 /*Offsets for Management (=MM) messages*/
119 #define PTP_MM_TARGETCOMMUNICATIONTECHNOLOGY_OFFSET 41
120 #define PTP_MM_TARGETUUID_OFFSET 42
121 #define PTP_MM_TARGETPORTID_OFFSET 48
122 #define PTP_MM_BOUNDARYHOPS_OFFSET 52
123 #define PTP_MM_MANAGEMENTMESSAGEKEY_OFFSET 55
124 #define PTP_MM_PARAMETERLENGTH_OFFSET 58
125 /*PARAMETERLENGTH > 0*/
126 #define PTP_MM_MESSAGEPARAMETERS_OFFSET 60
127 /*PTP_MM_CLOCK_IDENTITY (PARAMETERLENGTH = 64)*/
128 #define PTP_MM_CLOCK_IDENTITY_CLOCKCOMMUNICATIONTECHNOLOGY_OFFSET 63
129 #define PTP_MM_CLOCK_IDENTITY_CLOCKUUIDFIELD_OFFSET 64
130 #define PTP_MM_CLOCK_IDENTITY_CLOCKPORTFIELD_OFFSET 74
131 #define PTP_MM_CLOCK_IDENTITY_MANUFACTURERIDENTITY_OFFSET 76
133 /*PTP_MM_INITIALIZE_CLOCK (PARAMETERLENGTH = 4)*/
134 #define PTP_MM_INITIALIZE_CLOCK_INITIALISATIONKEY_OFFSET 62
136 /*PTP_MM_SET_SUBDOMAIN (PARAMETERLENGTH = 16)*/
137 #define PTP_MM_SET_SUBDOMAIN_SUBDOMAINNAME_OFFSET 60
139 /*PTP_MM_DEFAULT_DATA_SET (PARAMETERLENGTH = 76)*/
140 #define PTP_MM_DEFAULT_DATA_SET_CLOCKCOMMUNICATIONTECHNOLOGY_OFFSET 63
141 #define PTP_MM_DEFAULT_DATA_SET_CLOCKUUIDFIELD_OFFSET 64
142 #define PTP_MM_DEFAULT_DATA_SET_CLOCKPORTFIELD_OFFSET 74
143 #define PTP_MM_DEFAULT_DATA_SET_CLOCKSTRATUM_OFFSET 79
144 #define PTP_MM_DEFAULT_DATA_SET_CLOCKIDENTIFIER_OFFSET 80
145 #define PTP_MM_DEFAULT_DATA_SET_CLOCKVARIANCE_OFFSET 86
146 #define PTP_MM_DEFAULT_DATA_SET_CLOCKFOLLOWUPCAPABLE_OFFSET 89
147 #define PTP_MM_DEFAULT_DATA_SET_PREFERRED_OFFSET 95
148 #define PTP_MM_DEFAULT_DATA_SET_INITIALIZABLE_OFFSET 99
149 #define PTP_MM_DEFAULT_DATA_SET_EXTERNALTIMING_OFFSET 103
150 #define PTP_MM_DEFAULT_DATA_SET_ISBOUNDARYCLOCK_OFFSET 107
151 #define PTP_MM_DEFAULT_DATA_SET_SYNCINTERVAL_OFFSET 111
152 #define PTP_MM_DEFAULT_DATA_SET_SUBDOMAINNAME_OFFSET 112
153 #define PTP_MM_DEFAULT_DATA_SET_NUMBERPORTS_OFFSET 130
154 #define PTP_MM_DEFAULT_DATA_SET_NUMBERFOREIGNRECORDS_OFFSET 134
156 /*PTP_MM_UPDATE_DEFAULT_DATA_SET (PARAMETERLENGTH = 36)*/
157 #define PTP_MM_UPDATE_DEFAULT_DATA_SET_CLOCKSTRATUM_OFFSET 63
158 #define PTP_MM_UPDATE_DEFAULT_DATA_SET_CLOCKIDENTIFIER_OFFSET 64
159 #define PTP_MM_UPDATE_DEFAULT_DATA_SET_CLOCKVARIANCE_OFFSET 70
160 #define PTP_MM_UPDATE_DEFAULT_DATA_SET_PREFERRED_OFFSET 75
161 #define PTP_MM_UPDATE_DEFAULT_DATA_SET_SYNCINTERVAL_OFFSET 79
162 #define PTP_MM_UPDATE_DEFAULT_DATA_SET_SUBDOMAINNAME_OFFSET 80
164 /*PTP_MM_CURRENT_DATA_SET (PARAMETERLENGTH = 20)*/
165 #define PTP_MM_CURRENT_DATA_SET_STEPSREMOVED_OFFSET 62
166 #define PTP_MM_CURRENT_DATA_SET_OFFSETFROMMASTER_OFFSET 64
167 #define PTP_MM_CURRENT_DATA_SET_OFFSETFROMMASTERSECONDS_OFFSET 64
168 #define PTP_MM_CURRENT_DATA_SET_OFFSETFROMMASTERNANOSECONDS_OFFSET 68
169 #define PTP_MM_CURRENT_DATA_SET_ONEWAYDELAY_OFFSET 72
170 #define PTP_MM_CURRENT_DATA_SET_ONEWAYDELAYSECONDS_OFFSET 72
171 #define PTP_MM_CURRENT_DATA_SET_ONEWAYDELAYNANOSECONDS_OFFSET 76
173 /*PTP_MM_PARENT_DATA_SET (PARAMETERLENGTH = 90)*/
174 #define PTP_MM_PARENT_DATA_SET_PARENTCOMMUNICATIONTECHNOLOGY_OFFSET 63
175 #define PTP_MM_PARENT_DATA_SET_PARENTUUID_OFFSET 64
176 #define PTP_MM_PARENT_DATA_SET_PARENTPORTID_OFFSET 74
177 #define PTP_MM_PARENT_DATA_SET_PARENTLASTSYNCSEQUENCENUMBER_OFFSET 78
178 #define PTP_MM_PARENT_DATA_SET_PARENTFOLLOWUPCAPABLE_OFFSET 83
179 #define PTP_MM_PARENT_DATA_SET_PARENTEXTERNALTIMING_OFFSET 87
180 #define PTP_MM_PARENT_DATA_SET_PARENTVARIANCE_OFFSET 90
181 #define PTP_MM_PARENT_DATA_SET_PARENTSTATS_OFFSET 95
182 #define PTP_MM_PARENT_DATA_SET_OBSERVEDVARIANCE_OFFSET 98
183 #define PTP_MM_PARENT_DATA_SET_OBSERVEDDRIFT_OFFSET 100
184 #define PTP_MM_PARENT_DATA_SET_UTCREASONABLE_OFFSET 107
185 #define PTP_MM_PARENT_DATA_SET_GRANDMASTERCOMMUNICATIONTECHNOLOGY_OFFSET 111
186 #define PTP_MM_PARENT_DATA_SET_GRANDMASTERUUIDFIELD_OFFSET 112
187 #define PTP_MM_PARENT_DATA_SET_GRANDMASTERPORTIDFIELD_OFFSET 122
188 #define PTP_MM_PARENT_DATA_SET_GRANDMASTERSTRATUM_OFFSET 127
189 #define PTP_MM_PARENT_DATA_SET_GRANDMASTERIDENTIFIER_OFFSET 128
190 #define PTP_MM_PARENT_DATA_SET_GRANDMASTERVARIANCE_OFFSET 134
191 #define PTP_MM_PARENT_DATA_SET_GRANDMASTERPREFERRED_OFFSET 139
192 #define PTP_MM_PARENT_DATA_SET_GRANDMASTERISBOUNDARYCLOCK_OFFSET 143
193 #define PTP_MM_PARENT_DATA_SET_GRANDMASTERSEQUENCENUMBER_OFFSET 146
195 /*PTP_MM_PORT_DATA_SET (PARAMETERLENGTH = 52)*/
196 #define PTP_MM_PORT_DATA_SET_RETURNEDPORTNUMBER_OFFSET 62
197 #define PTP_MM_PORT_DATA_SET_PORTSTATE_OFFSET 67
198 #define PTP_MM_PORT_DATA_SET_LASTSYNCEVENTSEQUENCENUMBER_OFFSET 70
199 #define PTP_MM_PORT_DATA_SET_LASTGENERALEVENTSEQUENCENUMBER_OFFSET 74
200 #define PTP_MM_PORT_DATA_SET_PORTCOMMUNICATIONTECHNOLOGY_OFFSET 79
201 #define PTP_MM_PORT_DATA_SET_PORTUUIDFIELD_OFFSET 80
202 #define PTP_MM_PORT_DATA_SET_PORTIDFIELD_OFFSET 90
203 #define PTP_MM_PORT_DATA_SET_BURSTENABLED_OFFSET 95
204 #define PTP_MM_PORT_DATA_SET_SUBDOMAINADDRESSOCTETS_OFFSET 97
205 #define PTP_MM_PORT_DATA_SET_EVENTPORTADDRESSOCTETS_OFFSET 98
206 #define PTP_MM_PORT_DATA_SET_GENERALPORTADDRESSOCTETS_OFFSET 99
207 #define PTP_MM_PORT_DATA_SET_SUBDOMAINADDRESS_OFFSET 100
208 #define PTP_MM_PORT_DATA_SET_EVENTPORTADDRESS_OFFSET 106
209 #define PTP_MM_PORT_DATA_SET_GENERALPORTADDRESS_OFFSET 110
211 /*PTP_MM_GLOBAL_TIME_DATA_SET (PARAMETERLENGTH = 24)*/
212 #define PTP_MM_GLOBAL_TIME_DATA_SET_LOCALTIME_OFFSET 60
213 #define PTP_MM_GLOBAL_TIME_DATA_SET_LOCALTIMESECONDS_OFFSET 60
214 #define PTP_MM_GLOBAL_TIME_DATA_SET_LOCALTIMENANOSECONDS_OFFSET 64
215 #define PTP_MM_GLOBAL_TIME_DATA_SET_CURRENTUTCOFFSET_OFFSET 70
216 #define PTP_MM_GLOBAL_TIME_DATA_SET_LEAP59_OFFSET 75
217 #define PTP_MM_GLOBAL_TIME_DATA_SET_LEAP61_OFFSET 79
218 #define PTP_MM_GLOBAL_TIME_DATA_SET_EPOCHNUMBER_OFFSET 82
220 /*PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES (PARAMETERLENGTH = 16)*/
221 #define PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES_CURRENTUTCOFFSET_OFFSET 62
222 #define PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES_LEAP59_OFFSET 67
223 #define PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES_LEAP61_OFFSET 71
224 #define PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES_EPOCHNUMBER_OFFSET 74
226 /*PTP_MM_GET_FOREIGN_DATA_SET (PARAMETERLENGTH = 4)*/
227 #define PTP_MM_GET_FOREIGN_DATA_SET_RECORDKEY_OFFSET 62
229 /*PTP_MM_FOREIGN_DATA_SET (PARAMETERLENGTH = 28)*/
230 #define PTP_MM_FOREIGN_DATA_SET_RETURNEDPORTNUMBER_OFFSET 62
231 #define PTP_MM_FOREIGN_DATA_SET_RETURNEDRECORDNUMBER_OFFSET 66
232 #define PTP_MM_FOREIGN_DATA_SET_FOREIGNMASTERCOMMUNICATIONTECHNOLOGY_OFFSET 71
233 #define PTP_MM_FOREIGN_DATA_SET_FOREIGNMASTERUUIDFIELD_OFFSET 72
234 #define PTP_MM_FOREIGN_DATA_SET_FOREIGNMASTERPORTIDFIELD_OFFSET 82
235 #define PTP_MM_FOREIGN_DATA_SET_FOREIGNMASTERSYNCS_OFFSET 86
237 /*PTP_MM_SET_SYNC_INTERVAL (PARAMETERLENGTH = 4)*/
238 #define PTP_MM_SET_SYNC_INTERVAL_SYNCINTERVAL_OFFSET 62
240 /*PTP_MM_SET_TIME (PARAMETERLENGTH = 8)*/
241 #define PTP_MM_SET_TIME_LOCALTIME_OFFSET 60
242 #define PTP_MM_SET_TIME_LOCALTIMESECONDS_OFFSET 60
243 #define PTP_MM_SET_TIME_LOCALTIMENANOSECONDS_OFFSET 64
245 /*END Offsets of fields within a PTP packet.*/
247 /**********************************************************/
248 /* flag-field-mask-definitions */
249 /**********************************************************/
250 #define PTP_FLAGS_LI61_BITMASK 0x01
251 #define PTP_FLAGS_LI59_BITMASK 0x02
252 #define PTP_FLAGS_BOUNDARY_CLOCK_BITMASK 0x04
253 #define PTP_FLAGS_ASSIST_BITMASK 0x08
254 #define PTP_FLAGS_EXT_SYNC_BITMASK 0x10
255 #define PTP_FLAGS_PARENT_STATS_BITMASK 0x20
256 #define PTP_FLAGS_SYNC_BURST_BITMASK 0x40
258 /*END flag-field-mask-definitions*/
260 /**********************************************************/
261 /* managementMessage definitions */
262 /**********************************************************/
263 #define PTP_MM_NULL 0
264 #define PTP_MM_OBTAIN_IDENTITY 1
265 #define PTP_MM_CLOCK_IDENTITY 2
266 #define PTP_MM_INITIALIZE_CLOCK 3
267 #define PTP_MM_SET_SUBDOMAIN 4
268 #define PTP_MM_CLEAR_DESIGNATED_PREFERRED_MASTER 5
269 #define PTP_MM_SET_DESIGNATED_PREFERRED_MASTER 6
270 #define PTP_MM_GET_DEFAULT_DATA_SET 7
271 #define PTP_MM_DEFAULT_DATA_SET 8
272 #define PTP_MM_UPDATE_DEFAULT_DATA_SET 9
273 #define PTP_MM_GET_CURRENT_DATA_SET 10
274 #define PTP_MM_CURRENT_DATA_SET 11
275 #define PTP_MM_GET_PARENT_DATA_SET 12
276 #define PTP_MM_PARENT_DATA_SET 13
277 #define PTP_MM_GET_PORT_DATA_SET 14
278 #define PTP_MM_PORT_DATA_SET 15
279 #define PTP_MM_GET_GLOBAL_TIME_DATA_SET 16
280 #define PTP_MM_GLOBAL_TIME_DATA_SET 17
281 #define PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES 18
282 #define PTP_MM_GOTO_FAULTY_STATE 19
283 #define PTP_MM_GET_FOREIGN_DATA_SET 20
284 #define PTP_MM_FOREIGN_DATA_SET 21
285 #define PTP_MM_SET_SYNC_INTERVAL 22
286 #define PTP_MM_DISABLE_PORT 23
287 #define PTP_MM_ENABLE_PORT 24
288 #define PTP_MM_DISABLE_BURST 25
289 #define PTP_MM_ENABLE_BURST 26
290 #define PTP_MM_SET_TIME 27
292 static const value_string ptp_managementMessageKey_vals[] = {
293 {PTP_MM_NULL, "PTP_MM_NULL"},
294 {PTP_MM_OBTAIN_IDENTITY, "PTP_MM_OBTAIN_IDENTITY"},
295 {PTP_MM_CLOCK_IDENTITY, "PTP_MM_CLOCK_IDENTITY"},
296 {PTP_MM_INITIALIZE_CLOCK, "PTP_MM_INITIALIZE_CLOCK"},
297 {PTP_MM_SET_SUBDOMAIN, "PTP_MM_SET_SUBDOMAIN"},
298 {PTP_MM_CLEAR_DESIGNATED_PREFERRED_MASTER, "PTP_MM_CLEAR_DESIGNATED_PREFERRED_MASTER"},
299 {PTP_MM_SET_DESIGNATED_PREFERRED_MASTER, "PTP_MM_SET_DESIGNATED_PREFERRED_MASTER"},
300 {PTP_MM_GET_DEFAULT_DATA_SET, "PTP_MM_GET_DEFAULT_DATA_SET"},
301 {PTP_MM_DEFAULT_DATA_SET, "PTP_MM_DEFAULT_DATA_SET"},
302 {PTP_MM_UPDATE_DEFAULT_DATA_SET, "PTP_MM_UPDATE_DEFAULT_DATA_SET"},
303 {PTP_MM_GET_CURRENT_DATA_SET, "PTP_MM_GET_CURRENT_DATA_SET"},
304 {PTP_MM_CURRENT_DATA_SET, "PTP_MM_CURRENT_DATA_SET"},
305 {PTP_MM_GET_PARENT_DATA_SET, "PTP_MM_GET_PARENT_DATA_SET"},
306 {PTP_MM_PARENT_DATA_SET, "PTP_MM_PARENT_DATA_SET"},
307 {PTP_MM_GET_PORT_DATA_SET, "PTP_MM_GET_PORT_DATA_SET"},
308 {PTP_MM_PORT_DATA_SET, "PTP_MM_PORT_DATA_SET"},
309 {PTP_MM_GET_GLOBAL_TIME_DATA_SET, "PTP_MM_GET_GLOBAL_TIME_DATA_SET"},
310 {PTP_MM_GLOBAL_TIME_DATA_SET, "PTP_MM_GLOBAL_TIME_DATA_SET"},
311 {PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES, "PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES"},
312 {PTP_MM_GOTO_FAULTY_STATE, "PTP_MM_GOTO_FAULTY_STATE"},
313 {PTP_MM_GET_FOREIGN_DATA_SET, "PTP_MM_GET_FOREIGN_DATA_SET"},
314 {PTP_MM_FOREIGN_DATA_SET, "PTP_MM_FOREIGN_DATA_SET"},
315 {PTP_MM_SET_SYNC_INTERVAL, "PTP_MM_SET_SYNC_INTERVAL"},
316 {PTP_MM_DISABLE_PORT, "PTP_MM_DISABLE_PORT"},
317 {PTP_MM_ENABLE_PORT, "PTP_MM_ENABLE_PORT"},
318 {PTP_MM_DISABLE_BURST, "PTP_MM_DISABLE_BURST"},
319 {PTP_MM_ENABLE_BURST, "PTP_MM_ENABLE_BURST"},
320 {PTP_MM_SET_TIME, "PTP_MM_SET_TIME"},
322 /*same again but better readable text for info column*/
323 static const value_string ptp_managementMessageKey_infocolumn_vals[] = {
324 {PTP_MM_NULL, "Null"},
325 {PTP_MM_OBTAIN_IDENTITY, "Obtain Identity"},
326 {PTP_MM_CLOCK_IDENTITY, "Clock Identity"},
327 {PTP_MM_INITIALIZE_CLOCK, "Initialize Clock"},
328 {PTP_MM_SET_SUBDOMAIN, "Set Subdomain"},
329 {PTP_MM_CLEAR_DESIGNATED_PREFERRED_MASTER, "Clear Designated Preferred Master"},
330 {PTP_MM_SET_DESIGNATED_PREFERRED_MASTER, "Set Designated Preferred Master"},
331 {PTP_MM_GET_DEFAULT_DATA_SET, "Get Default Data Set"},
332 {PTP_MM_DEFAULT_DATA_SET, "Default Data Set"},
333 {PTP_MM_UPDATE_DEFAULT_DATA_SET, "Update Default Data Set"},
334 {PTP_MM_GET_CURRENT_DATA_SET, "Get Current Data Set"},
335 {PTP_MM_CURRENT_DATA_SET, "Current Data Set"},
336 {PTP_MM_GET_PARENT_DATA_SET, "Get Parent Data Set"},
337 {PTP_MM_PARENT_DATA_SET, "Parent Data Set"},
338 {PTP_MM_GET_PORT_DATA_SET, "Get Port Data Set"},
339 {PTP_MM_PORT_DATA_SET, "Port Data Set"},
340 {PTP_MM_GET_GLOBAL_TIME_DATA_SET, "Get Global Time Data Set"},
341 {PTP_MM_GLOBAL_TIME_DATA_SET, "Global Time Data Set"},
342 {PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES, "Update Global Time Properties"},
343 {PTP_MM_GOTO_FAULTY_STATE, "Goto Faulty State"},
344 {PTP_MM_GET_FOREIGN_DATA_SET, "Get Foreign Data Set"},
345 {PTP_MM_FOREIGN_DATA_SET, "Foreign Data Set"},
346 {PTP_MM_SET_SYNC_INTERVAL, "Set Sync Interval"},
347 {PTP_MM_DISABLE_PORT, "Disable Port"},
348 {PTP_MM_ENABLE_PORT, "Enable Port"},
349 {PTP_MM_DISABLE_BURST, "Disable Burst"},
350 {PTP_MM_ENABLE_BURST, "Enable Burst"},
351 {PTP_MM_SET_TIME, "Set Time"},
354 /*END managementMessage definitions*/
356 /**********************************************************/
357 /* CommunicationId definitions */
358 /**********************************************************/
362 #define PTP_PROFIBUS 5
366 #define PTP_CONTROLNET 9
367 #define PTP_CANOPEN 10
368 #define PTP_IEEE1394 243
369 #define PTP_IEEE802_11A 244
370 #define PTP_IEEE_WIRELESS 245
371 #define PTP_INFINIBAND 246
372 #define PTP_BLUETOOTH 247
373 #define PTP_IEEE802_15_1 248
374 #define PTP_IEEE1451_3 249
375 #define PTP_IEEE1451_5 250
380 #define PTP_DEFAULT 255
382 static const value_string ptp_communicationid_vals[] = {
383 {PTP_CLOSED, "Closed system outside the scope of this standard."},
384 {PTP_ETHER, "IEEE 802.3 (Ethernet)"},
385 {PTP_FFBUS, "FoundationFieldbus"},
386 {PTP_PROFIBUS, "PROFIBUS"},
387 {PTP_LON, "LonTalk"},
388 {PTP_DNET, "DeviceNet"},
389 {PTP_SDS, "SmartDistributedSystem"},
390 {PTP_CONTROLNET, "ControlNet"},
391 {PTP_CANOPEN, "CANopen"},
392 {PTP_IEEE1394, "IEEE 1394"},
393 {PTP_IEEE802_11A, "IEEE 802.11a"},
394 {PTP_IEEE_WIRELESS, "IEEE 802.11b"},
395 {PTP_INFINIBAND, "InfiniBand"},
396 {PTP_BLUETOOTH, "Bluetooth wireless"},
397 {PTP_IEEE802_15_1, "IEEE 802.15.1"},
398 {PTP_IEEE1451_3, "IEEE 1451.3"},
399 {PTP_IEEE1451_5, "IEEE 1451.5"},
400 {PTP_USB, "USB bus"},
401 {PTP_ISA, "ISA bus"},
402 {PTP_PCI, "PCI bus"},
403 {PTP_VXI, "VXI bus"},
404 {PTP_DEFAULT, "Default value"},
407 /*END CommunicationId definitions*/
409 /**********************************************************/
410 /* PTP message types (PTP_CONTROL field) */
411 /**********************************************************/
412 #define PTP_SYNC_MESSAGE 0x00
413 #define PTP_DELAY_REQ_MESSAGE 0x01
414 #define PTP_FOLLOWUP_MESSAGE 0x02
415 #define PTP_DELAY_RESP_MESSAGE 0x03
416 #define PTP_MANAGEMENT_MESSAGE 0x04
418 static const value_string ptp_control_vals[] = {
419 {PTP_SYNC_MESSAGE, "Sync Message"},
420 {PTP_DELAY_REQ_MESSAGE, "Delay_Req Message"},
421 {PTP_FOLLOWUP_MESSAGE, "Follow_Up Message"},
422 {PTP_DELAY_RESP_MESSAGE, "Delay_Resp Message"},
423 {PTP_MANAGEMENT_MESSAGE, "Management Message"},
426 /*END PTP message types*/
428 /**********************************************************/
429 /* Channel values for the PTP_MESSAGETYPE field */
430 /**********************************************************/
431 #define PTP_MESSAGETYPE_EVENT 0x01
432 #define PTP_MESSAGETYPE_GENERAL 0x02
434 static const value_string ptp_messagetype_vals[] = {
435 {PTP_MESSAGETYPE_EVENT, "Event Message"},
436 {PTP_MESSAGETYPE_GENERAL, "General Message"},
439 /*END channel values for the PTP_MESSAGETYPE field*/
441 /* Channel values for boolean vals (FLAGS)*/
443 static const value_string ptp_bool_vals[] = {
448 /**********************************************************/
449 /* Initialize the protocol and registered fields */
450 /**********************************************************/
452 static int proto_ptp = -1;
453 static int hf_ptp_versionptp = -1;
454 static int hf_ptp_versionnetwork = -1;
455 static int hf_ptp_subdomain = -1;
456 static int hf_ptp_messagetype = -1;
457 static int hf_ptp_sourcecommunicationtechnology = -1;
458 static int hf_ptp_sourceuuid = -1;
459 static int hf_ptp_sourceportid = -1;
460 static int hf_ptp_sequenceid = -1;
461 static int hf_ptp_control = -1;
462 static int hf_ptp_flags = -1;
463 static int hf_ptp_flags_li61 = -1;
464 static int hf_ptp_flags_li59 = -1;
465 static int hf_ptp_flags_boundary_clock = -1;
466 static int hf_ptp_flags_assist = -1;
467 static int hf_ptp_flags_ext_sync = -1;
468 static int hf_ptp_flags_parent = -1;
469 static int hf_ptp_flags_sync_burst = -1;
471 /*offsets for ptp_sync and delay_req (=sdr) messages*/
472 static int hf_ptp_origintimestamp = -1; /*Field for seconds & nanoseconds*/
473 static int hf_ptp_sdr_origintimestamp_seconds = -1;
474 static int hf_ptp_sdr_origintimestamp_nanoseconds = -1;
475 static int hf_ptp_sdr_epochnumber = -1;
476 static int hf_ptp_sdr_currentutcoffset = -1;
477 static int hf_ptp_sdr_grandmastercommunicationtechnology = -1;
478 static int hf_ptp_sdr_grandmasterclockuuid = -1;
479 static int hf_ptp_sdr_grandmasterportid = -1;
480 static int hf_ptp_sdr_grandmastersequenceid = -1;
481 static int hf_ptp_sdr_grandmasterclockstratum = -1;
482 static int hf_ptp_sdr_grandmasterclockidentifier = -1;
483 static int hf_ptp_sdr_grandmasterclockvariance = -1;
484 static int hf_ptp_sdr_grandmasterpreferred = -1;
485 static int hf_ptp_sdr_grandmasterisboundaryclock = -1;
486 static int hf_ptp_sdr_syncinterval = -1;
487 static int hf_ptp_sdr_localclockvariance = -1;
488 static int hf_ptp_sdr_localstepsremoved = -1;
489 static int hf_ptp_sdr_localclockstratum = -1;
490 static int hf_ptp_sdr_localclockidentifier = -1;
491 static int hf_ptp_sdr_parentcommunicationtechnology = -1;
492 static int hf_ptp_sdr_parentuuid = -1;
493 static int hf_ptp_sdr_parentportfield = -1;
494 static int hf_ptp_sdr_estimatedmastervariance = -1;
495 static int hf_ptp_sdr_estimatedmasterdrift = -1;
496 static int hf_ptp_sdr_utcreasonable = -1;
498 /*offsets for follow_up (=fu) messages*/
499 static int hf_ptp_fu_associatedsequenceid = -1;
500 static int hf_ptp_fu_preciseorigintimestamp = -1;
501 static int hf_ptp_fu_preciseorigintimestamp_seconds = -1;
502 static int hf_ptp_fu_preciseorigintimestamp_nanoseconds = -1;
504 /*offsets for delay_resp (=dr) messages*/
505 static int hf_ptp_dr_delayreceipttimestamp = -1;
506 static int hf_ptp_dr_delayreceipttimestamp_seconds = -1;
507 static int hf_ptp_dr_delayreceipttimestamp_nanoseconds = -1;
508 static int hf_ptp_dr_requestingsourcecommunicationtechnology = -1;
509 static int hf_ptp_dr_requestingsourceuuid = -1;
510 static int hf_ptp_dr_requestingsourceportid = -1;
511 static int hf_ptp_dr_requestingsourcesequenceid = -1;
513 /*offsets for management (=mm) messages*/
514 static int hf_ptp_mm_targetcommunicationtechnology = -1;
515 static int hf_ptp_mm_targetuuid = -1;
516 static int hf_ptp_mm_targetportid = -1;
517 static int hf_ptp_mm_boundaryhops = -1;
518 static int hf_ptp_mm_managementmessagekey = -1;
519 static int hf_ptp_mm_parameterlength = -1;
520 /*parameterlength > 0*/
521 static int hf_ptp_mm_messageparameters = -1;
522 /*ptp_mm_clock_identity (parameterlength = 64)*/
523 static int hf_ptp_mm_clock_identity_clockcommunicationtechnology = -1;
524 static int hf_ptp_mm_clock_identity_clockuuidfield = -1;
525 static int hf_ptp_mm_clock_identity_clockportfield = -1;
526 static int hf_ptp_mm_clock_identity_manufactureridentity = -1;
528 /*ptp_mm_initialize_clock (parameterlength = 4)*/
529 static int hf_ptp_mm_initialize_clock_initialisationkey = -1;
531 /*ptp_mm_set_subdomain (parameterlength = 16)*/
532 static int hf_ptp_mm_set_subdomain_subdomainname = -1;
534 /*ptp_mm_default_data_set (parameterlength = 76)*/
535 static int hf_ptp_mm_default_data_set_clockcommunicationtechnology = -1;
536 static int hf_ptp_mm_default_data_set_clockuuidfield = -1;
537 static int hf_ptp_mm_default_data_set_clockportfield = -1;
538 static int hf_ptp_mm_default_data_set_clockstratum = -1;
539 static int hf_ptp_mm_default_data_set_clockidentifier = -1;
540 static int hf_ptp_mm_default_data_set_clockvariance = -1;
541 static int hf_ptp_mm_default_data_set_clockfollowupcapable = -1;
542 static int hf_ptp_mm_default_data_set_preferred = -1;
543 static int hf_ptp_mm_default_data_set_initializable = -1;
544 static int hf_ptp_mm_default_data_set_externaltiming = -1;
545 static int hf_ptp_mm_default_data_set_isboundaryclock = -1;
546 static int hf_ptp_mm_default_data_set_syncinterval = -1;
547 static int hf_ptp_mm_default_data_set_subdomainname = -1;
548 static int hf_ptp_mm_default_data_set_numberports = -1;
549 static int hf_ptp_mm_default_data_set_numberforeignrecords = -1;
551 /*ptp_mm_update_default_data_set (parameterlength = 36)*/
552 static int hf_ptp_mm_update_default_data_set_clockstratum = -1;
553 static int hf_ptp_mm_update_default_data_set_clockidentifier = -1;
554 static int hf_ptp_mm_update_default_data_set_clockvariance = -1;
555 static int hf_ptp_mm_update_default_data_set_preferred = -1;
556 static int hf_ptp_mm_update_default_data_set_syncinterval = -1;
557 static int hf_ptp_mm_update_default_data_set_subdomainname = -1;
559 /*ptp_mm_current_data_set (parameterlength = 20)*/
560 static int hf_ptp_mm_current_data_set_stepsremoved = -1;
561 static int hf_ptp_mm_current_data_set_offsetfrommaster = -1;
562 static int hf_ptp_mm_current_data_set_offsetfrommasterseconds = -1;
563 static int hf_ptp_mm_current_data_set_offsetfrommasternanoseconds = -1;
564 static int hf_ptp_mm_current_data_set_onewaydelay = -1;
565 static int hf_ptp_mm_current_data_set_onewaydelayseconds = -1;
566 static int hf_ptp_mm_current_data_set_onewaydelaynanoseconds = -1;
568 /*ptp_mm_parent_data_set (parameterlength = 90)*/
569 static int hf_ptp_mm_parent_data_set_parentcommunicationtechnology = -1;
570 static int hf_ptp_mm_parent_data_set_parentuuid = -1;
571 static int hf_ptp_mm_parent_data_set_parentportid = -1;
572 static int hf_ptp_mm_parent_data_set_parentlastsyncsequencenumber = -1;
573 static int hf_ptp_mm_parent_data_set_parentfollowupcapable = -1;
574 static int hf_ptp_mm_parent_data_set_parentexternaltiming = -1;
575 static int hf_ptp_mm_parent_data_set_parentvariance = -1;
576 static int hf_ptp_mm_parent_data_set_parentstats = -1;
577 static int hf_ptp_mm_parent_data_set_observedvariance = -1;
578 static int hf_ptp_mm_parent_data_set_observeddrift = -1;
579 static int hf_ptp_mm_parent_data_set_utcreasonable = -1;
580 static int hf_ptp_mm_parent_data_set_grandmastercommunicationtechnology = -1;
581 static int hf_ptp_mm_parent_data_set_grandmasteruuidfield = -1;
582 static int hf_ptp_mm_parent_data_set_grandmasterportidfield = -1;
583 static int hf_ptp_mm_parent_data_set_grandmasterstratum = -1;
584 static int hf_ptp_mm_parent_data_set_grandmasteridentifier = -1;
585 static int hf_ptp_mm_parent_data_set_grandmastervariance = -1;
586 static int hf_ptp_mm_parent_data_set_grandmasterpreferred = -1;
587 static int hf_ptp_mm_parent_data_set_grandmasterisboundaryclock = -1;
588 static int hf_ptp_mm_parent_data_set_grandmastersequencenumber = -1;
590 /*ptp_mm_port_data_set (parameterlength = 52)*/
591 static int hf_ptp_mm_port_data_set_returnedportnumber = -1;
592 static int hf_ptp_mm_port_data_set_portstate = -1;
593 static int hf_ptp_mm_port_data_set_lastsynceventsequencenumber = -1;
594 static int hf_ptp_mm_port_data_set_lastgeneraleventsequencenumber = -1;
595 static int hf_ptp_mm_port_data_set_portcommunicationtechnology = -1;
596 static int hf_ptp_mm_port_data_set_portuuidfield = -1;
597 static int hf_ptp_mm_port_data_set_portidfield = -1;
598 static int hf_ptp_mm_port_data_set_burstenabled = -1;
599 static int hf_ptp_mm_port_data_set_subdomainaddressoctets = -1;
600 static int hf_ptp_mm_port_data_set_eventportaddressoctets = -1;
601 static int hf_ptp_mm_port_data_set_generalportaddressoctets = -1;
602 static int hf_ptp_mm_port_data_set_subdomainaddress = -1;
603 static int hf_ptp_mm_port_data_set_eventportaddress = -1;
604 static int hf_ptp_mm_port_data_set_generalportaddress = -1;
606 /*ptp_mm_global_time_data_set (parameterlength = 24)*/
607 static int hf_ptp_mm_global_time_data_set_localtime = -1;
608 static int hf_ptp_mm_global_time_data_set_localtimeseconds = -1;
609 static int hf_ptp_mm_global_time_data_set_localtimenanoseconds = -1;
610 static int hf_ptp_mm_global_time_data_set_currentutcoffset = -1;
611 static int hf_ptp_mm_global_time_data_set_leap59 = -1;
612 static int hf_ptp_mm_global_time_data_set_leap61 = -1;
613 static int hf_ptp_mm_global_time_data_set_epochnumber = -1;
615 /*ptp_mm_update_global_time_properties (parameterlength = 16)*/
616 static int hf_ptp_mm_update_global_time_properties_currentutcoffset = -1;
617 static int hf_ptp_mm_update_global_time_properties_leap59 = -1;
618 static int hf_ptp_mm_update_global_time_properties_leap61 = -1;
619 static int hf_ptp_mm_update_global_time_properties_epochnumber = -1;
621 /*ptp_mm_get_foreign_data_set (parameterlength = 4)*/
622 static int hf_ptp_mm_get_foreign_data_set_recordkey = -1;
624 /*ptp_mm_foreign_data_set (parameterlength = 28)*/
625 static int hf_ptp_mm_foreign_data_set_returnedportnumber = -1;
626 static int hf_ptp_mm_foreign_data_set_returnedrecordnumber = -1;
627 static int hf_ptp_mm_foreign_data_set_foreignmastercommunicationtechnology = -1;
628 static int hf_ptp_mm_foreign_data_set_foreignmasteruuidfield = -1;
629 static int hf_ptp_mm_foreign_data_set_foreignmasterportidfield = -1;
630 static int hf_ptp_mm_foreign_data_set_foreignmastersyncs = -1;
632 /*ptp_mm_set_sync_interval (parameterlength = 4)*/
633 static int hf_ptp_mm_set_sync_interval_syncinterval = -1;
635 /*ptp_mm_set_time (parameterlength = 8)*/
636 static int hf_ptp_mm_set_time_localtime = -1;
637 static int hf_ptp_mm_set_time_localtimeseconds = -1;
638 static int hf_ptp_mm_set_time_localtimenanoseconds = -1;
640 /*END Initialize the protocol and registered fields */
642 /* Initialize the subtree pointers */
643 static gint ett_ptp = -1;
644 static gint ett_ptp_flags = -1;
645 static gint ett_ptp_time = -1;
646 static gint ett_ptp_time2 = -1;
649 /* Code to actually dissect the packets */
651 dissect_ptp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
653 guint8 ptp_control, ptp_mm_messagekey = 0;
654 nstime_t ts; /*time structure with seconds and nanoseconds*/
656 /* Set up structures needed to add the protocol subtree and manage it */
657 proto_item *ti, *flags_ti, *time_ti, *time2_ti;
658 proto_tree *ptp_tree, *ptp_flags_tree, *ptp_time_tree, *ptp_time2_tree;
660 /* Make entries in Protocol column and Info column on summary display */
661 if (check_col(pinfo->cinfo, COL_PROTOCOL))
662 col_set_str(pinfo->cinfo, COL_PROTOCOL, "PTP");
665 /* Get control field (what kind of message is this? (Sync, DelayReq, ....) */
667 ptp_control = tvb_get_guint8 (tvb, PTP_CONTROL_OFFSET);
669 if ( ptp_control == PTP_MANAGEMENT_MESSAGE ){
670 /* Get the managementMessageKey */
671 ptp_mm_messagekey = tvb_get_guint8(tvb, PTP_MM_MANAGEMENTMESSAGEKEY_OFFSET);
674 /* Create and set the string for "Info" column */
676 case PTP_SYNC_MESSAGE:{
677 if (check_col(pinfo->cinfo, COL_INFO))
678 col_set_str(pinfo->cinfo, COL_INFO, "Sync Message");
681 case PTP_DELAY_REQ_MESSAGE:{
682 if (check_col(pinfo->cinfo, COL_INFO))
683 col_set_str(pinfo->cinfo, COL_INFO, "Delay_Request Message");
686 case PTP_FOLLOWUP_MESSAGE:{
687 if (check_col(pinfo->cinfo, COL_INFO))
688 col_set_str(pinfo->cinfo, COL_INFO, "Follow_Up Message");
691 case PTP_DELAY_RESP_MESSAGE:{
692 if (check_col(pinfo->cinfo, COL_INFO))
693 col_set_str(pinfo->cinfo, COL_INFO, "Delay_Response Message");
696 case PTP_MANAGEMENT_MESSAGE:{
697 if (check_col(pinfo->cinfo, COL_INFO)){
698 col_add_fstr(pinfo->cinfo, COL_INFO, "Management Message (%s)",
699 val_to_str(ptp_mm_messagekey,
700 ptp_managementMessageKey_infocolumn_vals,
701 "Unknown message key %u"));
706 if (check_col(pinfo->cinfo, COL_INFO))
707 col_add_str(pinfo->cinfo, COL_INFO, "Unknown Message");
714 /* create display subtree for the protocol */
715 ti = proto_tree_add_item(tree, proto_ptp, tvb, 0, -1, FALSE);
717 ptp_tree = proto_item_add_subtree(ti, ett_ptp);
719 proto_tree_add_item(ptp_tree,
720 hf_ptp_versionptp, tvb, PTP_VERSIONPTP_OFFSET, 2, FALSE);
722 proto_tree_add_item(ptp_tree,
723 hf_ptp_versionnetwork, tvb, PTP_VERSIONNETWORK_OFFSET, 2, FALSE);
725 proto_tree_add_item(ptp_tree,
726 hf_ptp_subdomain, tvb, PTP_SUBDOMAIN_OFFSET, 16, FALSE);
728 proto_tree_add_item(ptp_tree,
729 hf_ptp_messagetype, tvb, PTP_MESSAGETYPE_OFFSET, 1, FALSE);
731 proto_tree_add_item(ptp_tree,
732 hf_ptp_sourcecommunicationtechnology, tvb, PTP_SOURCECOMMUNICATIONTECHNOLOGY_OFFSET, 1, FALSE);
734 proto_tree_add_item(ptp_tree,
735 hf_ptp_sourceuuid, tvb, PTP_SOURCEUUID_OFFSET, 6, FALSE);
737 proto_tree_add_item(ptp_tree,
738 hf_ptp_sourceportid, tvb, PTP_SOURCEPORTID_OFFSET, 2, FALSE);
740 proto_tree_add_item(ptp_tree,
741 hf_ptp_sequenceid, tvb, PTP_SEQUENCEID_OFFSET, 2, FALSE);
743 proto_tree_add_item(ptp_tree,
744 hf_ptp_control, tvb, PTP_CONTROL_OFFSET, 1, FALSE);
746 /*Subtree for the flag-field*/
748 flags_ti = proto_tree_add_item(ptp_tree,
749 hf_ptp_flags, tvb, PTP_FLAGS_OFFSET, 2, FALSE);
751 ptp_flags_tree = proto_item_add_subtree(flags_ti, ett_ptp_flags);
753 proto_tree_add_item(ptp_flags_tree,
754 hf_ptp_flags_li61, tvb, PTP_FLAGS_LI61_OFFSET, 2, FALSE);
756 proto_tree_add_item(ptp_flags_tree,
757 hf_ptp_flags_li59, tvb, PTP_FLAGS_LI59_OFFSET, 2, FALSE);
759 proto_tree_add_item(ptp_flags_tree,
760 hf_ptp_flags_boundary_clock, tvb, PTP_FLAGS_BOUNDARY_CLOCK_OFFSET, 2, FALSE);
762 proto_tree_add_item(ptp_flags_tree,
763 hf_ptp_flags_assist, tvb, PTP_FLAGS_ASSIST_OFFSET, 2, FALSE);
765 proto_tree_add_item(ptp_flags_tree,
766 hf_ptp_flags_ext_sync, tvb, PTP_FLAGS_EXT_SYNC_OFFSET, 2, FALSE);
768 proto_tree_add_item(ptp_flags_tree,
769 hf_ptp_flags_parent, tvb, PTP_FLAGS_PARENT_STATS_OFFSET, 2, FALSE);
771 proto_tree_add_item(ptp_flags_tree,
772 hf_ptp_flags_sync_burst, tvb, PTP_FLAGS_SYNC_BURST_OFFSET, 2, FALSE);
775 /* The rest of the ptp-dissector depends on the control-field */
778 case PTP_SYNC_MESSAGE:
779 case PTP_DELAY_REQ_MESSAGE:{
781 /*Subtree for the timestamp-field*/
782 ts.secs = tvb_get_ntohl(tvb, PTP_SDR_ORIGINTIMESTAMP_SECONDS_OFFSET);
783 ts.nsecs = tvb_get_ntohl(tvb, PTP_SDR_ORIGINTIMESTAMP_NANOSECONDS_OFFSET);
785 time_ti = proto_tree_add_time(ptp_tree,
786 hf_ptp_origintimestamp, tvb, PTP_SDR_ORIGINTIMESTAMP_OFFSET, 8, &ts);
788 ptp_time_tree = proto_item_add_subtree(time_ti, ett_ptp_time);
790 proto_tree_add_item(ptp_time_tree,
791 hf_ptp_sdr_origintimestamp_seconds, tvb,
792 PTP_SDR_ORIGINTIMESTAMP_SECONDS_OFFSET, 4, FALSE);
794 proto_tree_add_item(ptp_time_tree, hf_ptp_sdr_origintimestamp_nanoseconds, tvb,
795 PTP_SDR_ORIGINTIMESTAMP_NANOSECONDS_OFFSET, 4, FALSE);
798 proto_tree_add_item(ptp_tree,
799 hf_ptp_sdr_epochnumber, tvb, PTP_SDR_EPOCHNUMBER_OFFSET, 2, FALSE);
801 proto_tree_add_item(ptp_tree,
802 hf_ptp_sdr_currentutcoffset, tvb, PTP_SDR_CURRENTUTCOFFSET_OFFSET, 2, FALSE);
804 proto_tree_add_item(ptp_tree, hf_ptp_sdr_grandmastercommunicationtechnology, tvb,
805 PTP_SDR_GRANDMASTERCOMMUNICATIONTECHNOLOGY_OFFSET, 1, FALSE);
807 proto_tree_add_item(ptp_tree,
808 hf_ptp_sdr_grandmasterclockuuid, tvb, PTP_SDR_GRANDMASTERCLOCKUUID_OFFSET, 6, FALSE);
810 proto_tree_add_item(ptp_tree,
811 hf_ptp_sdr_grandmasterportid, tvb, PTP_SDR_GRANDMASTERPORTID_OFFSET, 2, FALSE);
813 proto_tree_add_item(ptp_tree,
814 hf_ptp_sdr_grandmastersequenceid, tvb, PTP_SDR_GRANDMASTERSEQUENCEID_OFFSET, 2, FALSE);
816 proto_tree_add_item(ptp_tree,
817 hf_ptp_sdr_grandmasterclockstratum, tvb,
818 PTP_SDR_GRANDMASTERCLOCKSTRATUM_OFFSET, 1, FALSE);
820 proto_tree_add_item(ptp_tree, hf_ptp_sdr_grandmasterclockidentifier, tvb,
821 PTP_SDR_GRANDMASTERCLOCKIDENTIFIER_OFFSET, 4, FALSE);
823 proto_tree_add_item(ptp_tree,
824 hf_ptp_sdr_grandmasterclockvariance, tvb,
825 PTP_SDR_GRANDMASTERCLOCKVARIANCE_OFFSET, 2, FALSE);
827 proto_tree_add_item(ptp_tree,
828 hf_ptp_sdr_grandmasterpreferred, tvb, PTP_SDR_GRANDMASTERPREFERRED_OFFSET, 1, FALSE);
830 proto_tree_add_item(ptp_tree, hf_ptp_sdr_grandmasterisboundaryclock, tvb,
831 PTP_SDR_GRANDMASTERISBOUNDARYCLOCK_OFFSET, 1, FALSE);
833 proto_tree_add_item(ptp_tree,
834 hf_ptp_sdr_syncinterval, tvb, PTP_SDR_SYNCINTERVAL_OFFSET, 1, FALSE);
836 proto_tree_add_item(ptp_tree,
837 hf_ptp_sdr_localclockvariance, tvb, PTP_SDR_LOCALCLOCKVARIANCE_OFFSET, 2, FALSE);
839 proto_tree_add_item(ptp_tree,
840 hf_ptp_sdr_localstepsremoved, tvb, PTP_SDR_LOCALSTEPSREMOVED_OFFSET, 2, FALSE);
842 proto_tree_add_item(ptp_tree,
843 hf_ptp_sdr_localclockstratum, tvb, PTP_SDR_LOCALCLOCKSTRATUM_OFFSET, 1, FALSE);
845 proto_tree_add_item(ptp_tree,
846 hf_ptp_sdr_localclockidentifier, tvb, PTP_SDR_LOCALCLOCKIDENTIFIER_OFFSET, 4, FALSE);
848 proto_tree_add_item(ptp_tree, hf_ptp_sdr_parentcommunicationtechnology, tvb,
849 PTP_SDR_PARENTCOMMUNICATIONTECHNOLOGY_OFFSET, 1, FALSE);
851 proto_tree_add_item(ptp_tree,
852 hf_ptp_sdr_parentuuid, tvb, PTP_SDR_PARENTUUID_OFFSET, 6, FALSE);
854 proto_tree_add_item(ptp_tree,
855 hf_ptp_sdr_parentportfield, tvb, PTP_SDR_PARENTPORTFIELD_OFFSET, 2, FALSE);
857 proto_tree_add_item(ptp_tree,
858 hf_ptp_sdr_estimatedmastervariance, tvb,
859 PTP_SDR_ESTIMATEDMASTERVARIANCE_OFFSET, 2, FALSE);
861 proto_tree_add_item(ptp_tree,
862 hf_ptp_sdr_estimatedmasterdrift, tvb, PTP_SDR_ESTIMATEDMASTERDRIFT_OFFSET, 4, FALSE);
864 proto_tree_add_item(ptp_tree,
865 hf_ptp_sdr_utcreasonable, tvb, PTP_SDR_UTCREASONABLE_OFFSET, 1, FALSE);
868 case PTP_FOLLOWUP_MESSAGE:{
869 proto_tree_add_item(ptp_tree,
870 hf_ptp_fu_associatedsequenceid, tvb, PTP_FU_ASSOCIATEDSEQUENCEID_OFFSET, 2, FALSE);
872 /*Subtree for the timestamp-field*/
873 ts.secs = tvb_get_ntohl(tvb, PTP_FU_PRECISEORIGINTIMESTAMP_SECONDS_OFFSET);
874 ts.nsecs = tvb_get_ntohl(tvb, PTP_FU_PRECISEORIGINTIMESTAMP_NANOSECONDS_OFFSET);
876 time_ti = proto_tree_add_time(ptp_tree,
877 hf_ptp_fu_preciseorigintimestamp, tvb,
878 PTP_FU_PRECISEORIGINTIMESTAMP_OFFSET, 8, &ts);
880 ptp_time_tree = proto_item_add_subtree(time_ti, ett_ptp_time);
882 proto_tree_add_item(ptp_time_tree, hf_ptp_fu_preciseorigintimestamp_seconds, tvb,
883 PTP_FU_PRECISEORIGINTIMESTAMP_SECONDS_OFFSET, 4, FALSE);
885 proto_tree_add_item(ptp_time_tree, hf_ptp_fu_preciseorigintimestamp_nanoseconds, tvb,
886 PTP_FU_PRECISEORIGINTIMESTAMP_NANOSECONDS_OFFSET, 4, FALSE);
890 case PTP_DELAY_RESP_MESSAGE:{
891 /*Subtree for the timestamp-field*/
892 ts.secs = tvb_get_ntohl(tvb, PTP_DR_DELAYRECEIPTTIMESTAMP_SECONDS_OFFSET);
893 ts.nsecs = tvb_get_ntohl(tvb, PTP_DR_DELAYRECEIPTTIMESTAMP_NANOSECONDS_OFFSET);
895 time_ti = proto_tree_add_time(ptp_tree,
896 hf_ptp_dr_delayreceipttimestamp, tvb,
897 PTP_DR_DELAYRECEIPTTIMESTAMP_OFFSET, 8, &ts);
899 ptp_time_tree = proto_item_add_subtree(time_ti, ett_ptp_time);
901 proto_tree_add_item(ptp_time_tree, hf_ptp_dr_delayreceipttimestamp_seconds, tvb,
902 PTP_DR_DELAYRECEIPTTIMESTAMP_SECONDS_OFFSET, 4, FALSE);
904 proto_tree_add_item(ptp_time_tree, hf_ptp_dr_delayreceipttimestamp_nanoseconds, tvb,
905 PTP_DR_DELAYRECEIPTTIMESTAMP_NANOSECONDS_OFFSET, 4, FALSE);
908 proto_tree_add_item(ptp_tree, hf_ptp_dr_requestingsourcecommunicationtechnology, tvb,
909 PTP_DR_REQUESTINGSOURCECOMMUNICATIONTECHNOLOGY_OFFSET, 1, FALSE);
911 proto_tree_add_item(ptp_tree,
912 hf_ptp_dr_requestingsourceuuid, tvb, PTP_DR_REQUESTINGSOURCEUUID_OFFSET, 6, FALSE);
914 proto_tree_add_item(ptp_tree,
915 hf_ptp_dr_requestingsourceportid, tvb, PTP_DR_REQUESTINGSOURCEPORTID_OFFSET, 2, FALSE);
917 proto_tree_add_item(ptp_tree,
918 hf_ptp_dr_requestingsourcesequenceid, tvb,
919 PTP_DR_REQUESTINGSOURCESEQUENCEID_OFFSET, 2, FALSE);
922 case PTP_MANAGEMENT_MESSAGE:{
923 proto_tree_add_item(ptp_tree, hf_ptp_mm_targetcommunicationtechnology, tvb,
924 PTP_MM_TARGETCOMMUNICATIONTECHNOLOGY_OFFSET, 1, FALSE);
926 proto_tree_add_item(ptp_tree,
927 hf_ptp_mm_targetuuid, tvb, PTP_MM_TARGETUUID_OFFSET, 6, FALSE);
929 proto_tree_add_item(ptp_tree,
930 hf_ptp_mm_targetportid, tvb, PTP_MM_TARGETPORTID_OFFSET, 2, FALSE);
932 proto_tree_add_item(ptp_tree,
933 hf_ptp_mm_boundaryhops, tvb, PTP_MM_BOUNDARYHOPS_OFFSET, 2, FALSE);
935 proto_tree_add_item(ptp_tree,
936 hf_ptp_mm_managementmessagekey, tvb, PTP_MM_MANAGEMENTMESSAGEKEY_OFFSET, 1, FALSE);
938 proto_tree_add_item(ptp_tree,
939 hf_ptp_mm_parameterlength, tvb, PTP_MM_PARAMETERLENGTH_OFFSET, 2, FALSE);
941 switch(ptp_mm_messagekey){
942 case PTP_MM_CLOCK_IDENTITY:{
943 proto_tree_add_item(ptp_tree,
944 hf_ptp_mm_clock_identity_clockcommunicationtechnology, tvb,
945 PTP_MM_CLOCK_IDENTITY_CLOCKCOMMUNICATIONTECHNOLOGY_OFFSET, 1, FALSE);
947 proto_tree_add_item(ptp_tree, hf_ptp_mm_clock_identity_clockuuidfield, tvb,
948 PTP_MM_CLOCK_IDENTITY_CLOCKUUIDFIELD_OFFSET, 6, FALSE);
950 proto_tree_add_item(ptp_tree, hf_ptp_mm_clock_identity_clockportfield, tvb,
951 PTP_MM_CLOCK_IDENTITY_CLOCKPORTFIELD_OFFSET, 2, FALSE);
953 proto_tree_add_item(ptp_tree, hf_ptp_mm_clock_identity_manufactureridentity, tvb,
954 PTP_MM_CLOCK_IDENTITY_MANUFACTURERIDENTITY_OFFSET, 48, FALSE);
957 case PTP_MM_INITIALIZE_CLOCK:{
958 proto_tree_add_item(ptp_tree, hf_ptp_mm_initialize_clock_initialisationkey, tvb,
959 PTP_MM_INITIALIZE_CLOCK_INITIALISATIONKEY_OFFSET, 2, FALSE);
962 case PTP_MM_SET_SUBDOMAIN:{
963 proto_tree_add_item(ptp_tree, hf_ptp_mm_set_subdomain_subdomainname, tvb,
964 PTP_MM_SET_SUBDOMAIN_SUBDOMAINNAME_OFFSET, 16, FALSE);
967 case PTP_MM_DEFAULT_DATA_SET:{
968 proto_tree_add_item(ptp_tree, hf_ptp_mm_default_data_set_clockcommunicationtechnology,
969 tvb, PTP_MM_DEFAULT_DATA_SET_CLOCKCOMMUNICATIONTECHNOLOGY_OFFSET,
972 proto_tree_add_item(ptp_tree, hf_ptp_mm_default_data_set_clockuuidfield, tvb,
973 PTP_MM_DEFAULT_DATA_SET_CLOCKUUIDFIELD_OFFSET, 6, FALSE);
975 proto_tree_add_item(ptp_tree, hf_ptp_mm_default_data_set_clockportfield, tvb,
976 PTP_MM_DEFAULT_DATA_SET_CLOCKPORTFIELD_OFFSET, 2, FALSE);
978 proto_tree_add_item(ptp_tree, hf_ptp_mm_default_data_set_clockstratum, tvb,
979 PTP_MM_DEFAULT_DATA_SET_CLOCKSTRATUM_OFFSET, 1, FALSE);
981 proto_tree_add_item(ptp_tree, hf_ptp_mm_default_data_set_clockidentifier, tvb,
982 PTP_MM_DEFAULT_DATA_SET_CLOCKIDENTIFIER_OFFSET, 4, FALSE);
984 proto_tree_add_item(ptp_tree, hf_ptp_mm_default_data_set_clockvariance, tvb,
985 PTP_MM_DEFAULT_DATA_SET_CLOCKVARIANCE_OFFSET, 2, FALSE);
987 proto_tree_add_item(ptp_tree, hf_ptp_mm_default_data_set_clockfollowupcapable, tvb,
988 PTP_MM_DEFAULT_DATA_SET_CLOCKFOLLOWUPCAPABLE_OFFSET, 1, FALSE);
990 proto_tree_add_item(ptp_tree, hf_ptp_mm_default_data_set_preferred, tvb,
991 PTP_MM_DEFAULT_DATA_SET_PREFERRED_OFFSET, 1, FALSE);
993 proto_tree_add_item(ptp_tree, hf_ptp_mm_default_data_set_initializable, tvb,
994 PTP_MM_DEFAULT_DATA_SET_INITIALIZABLE_OFFSET, 1, FALSE);
996 proto_tree_add_item(ptp_tree, hf_ptp_mm_default_data_set_externaltiming, tvb,
997 PTP_MM_DEFAULT_DATA_SET_EXTERNALTIMING_OFFSET, 1, FALSE);
999 proto_tree_add_item(ptp_tree, hf_ptp_mm_default_data_set_isboundaryclock, tvb,
1000 PTP_MM_DEFAULT_DATA_SET_ISBOUNDARYCLOCK_OFFSET, 1, FALSE);
1002 proto_tree_add_item(ptp_tree, hf_ptp_mm_default_data_set_syncinterval, tvb,
1003 PTP_MM_DEFAULT_DATA_SET_SYNCINTERVAL_OFFSET, 1, FALSE);
1005 proto_tree_add_item(ptp_tree, hf_ptp_mm_default_data_set_subdomainname, tvb,
1006 PTP_MM_DEFAULT_DATA_SET_SUBDOMAINNAME_OFFSET, 16, FALSE);
1008 proto_tree_add_item(ptp_tree, hf_ptp_mm_default_data_set_numberports, tvb,
1009 PTP_MM_DEFAULT_DATA_SET_NUMBERPORTS_OFFSET, 2, FALSE);
1011 proto_tree_add_item(ptp_tree, hf_ptp_mm_default_data_set_numberforeignrecords, tvb,
1012 PTP_MM_DEFAULT_DATA_SET_NUMBERFOREIGNRECORDS_OFFSET, 2, FALSE);
1015 case PTP_MM_UPDATE_DEFAULT_DATA_SET:{
1016 proto_tree_add_item(ptp_tree, hf_ptp_mm_update_default_data_set_clockstratum, tvb,
1017 PTP_MM_UPDATE_DEFAULT_DATA_SET_CLOCKSTRATUM_OFFSET, 1, FALSE);
1019 proto_tree_add_item(ptp_tree, hf_ptp_mm_update_default_data_set_clockidentifier, tvb,
1020 PTP_MM_UPDATE_DEFAULT_DATA_SET_CLOCKIDENTIFIER_OFFSET, 4, FALSE);
1022 proto_tree_add_item(ptp_tree, hf_ptp_mm_update_default_data_set_clockvariance, tvb,
1023 PTP_MM_UPDATE_DEFAULT_DATA_SET_CLOCKVARIANCE_OFFSET, 2, FALSE);
1025 proto_tree_add_item(ptp_tree, hf_ptp_mm_update_default_data_set_preferred, tvb,
1026 PTP_MM_UPDATE_DEFAULT_DATA_SET_PREFERRED_OFFSET, 1, FALSE);
1028 proto_tree_add_item(ptp_tree, hf_ptp_mm_update_default_data_set_syncinterval, tvb,
1029 PTP_MM_UPDATE_DEFAULT_DATA_SET_SYNCINTERVAL_OFFSET, 1, FALSE);
1031 proto_tree_add_item(ptp_tree, hf_ptp_mm_update_default_data_set_subdomainname, tvb,
1032 PTP_MM_UPDATE_DEFAULT_DATA_SET_SUBDOMAINNAME_OFFSET, 16, FALSE);
1035 case PTP_MM_CURRENT_DATA_SET:{
1036 proto_tree_add_item(ptp_tree, hf_ptp_mm_current_data_set_stepsremoved, tvb,
1037 PTP_MM_CURRENT_DATA_SET_STEPSREMOVED_OFFSET, 2, FALSE);
1039 /* Subtree for offset from master*/
1040 ts.secs = tvb_get_ntohl(tvb, PTP_MM_CURRENT_DATA_SET_OFFSETFROMMASTERSECONDS_OFFSET);
1042 ts.nsecs = tvb_get_ntohl(tvb,
1043 PTP_MM_CURRENT_DATA_SET_OFFSETFROMMASTERNANOSECONDS_OFFSET);
1046 time_ti = proto_tree_add_time(ptp_tree,
1047 hf_ptp_mm_current_data_set_offsetfrommaster, tvb,
1048 PTP_MM_CURRENT_DATA_SET_OFFSETFROMMASTER_OFFSET, 8, &ts);
1050 ptp_time_tree = proto_item_add_subtree(time_ti, ett_ptp_time);
1052 proto_tree_add_item(ptp_time_tree,
1053 hf_ptp_mm_current_data_set_offsetfrommasterseconds, tvb,
1054 PTP_MM_CURRENT_DATA_SET_OFFSETFROMMASTERSECONDS_OFFSET, 4, FALSE);
1056 proto_tree_add_item(ptp_time_tree,
1057 hf_ptp_mm_current_data_set_offsetfrommasternanoseconds, tvb,
1058 PTP_MM_CURRENT_DATA_SET_OFFSETFROMMASTERNANOSECONDS_OFFSET, 4, FALSE);
1061 /* Subtree for offset from master*/
1062 ts.secs = tvb_get_ntohl(tvb, PTP_MM_CURRENT_DATA_SET_ONEWAYDELAYSECONDS_OFFSET);
1064 ts.nsecs = tvb_get_ntohl(tvb, PTP_MM_CURRENT_DATA_SET_ONEWAYDELAYNANOSECONDS_OFFSET);
1067 time2_ti = proto_tree_add_time(ptp_tree,
1068 hf_ptp_mm_current_data_set_onewaydelay, tvb,
1069 PTP_MM_CURRENT_DATA_SET_ONEWAYDELAY_OFFSET, 8, &ts);
1071 ptp_time2_tree = proto_item_add_subtree(time2_ti, ett_ptp_time2);
1073 proto_tree_add_item(ptp_time2_tree, hf_ptp_mm_current_data_set_onewaydelayseconds,
1074 tvb, PTP_MM_CURRENT_DATA_SET_ONEWAYDELAYSECONDS_OFFSET, 4, FALSE);
1076 proto_tree_add_item(ptp_time2_tree,
1077 hf_ptp_mm_current_data_set_onewaydelaynanoseconds,
1078 tvb, PTP_MM_CURRENT_DATA_SET_ONEWAYDELAYNANOSECONDS_OFFSET, 4, FALSE);
1082 case PTP_MM_PARENT_DATA_SET:{
1083 proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_parentcommunicationtechnology,
1084 tvb, PTP_MM_PARENT_DATA_SET_PARENTCOMMUNICATIONTECHNOLOGY_OFFSET,
1087 proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_parentuuid, tvb,
1088 PTP_MM_PARENT_DATA_SET_PARENTUUID_OFFSET, 6, FALSE);
1090 proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_parentportid, tvb,
1091 PTP_MM_PARENT_DATA_SET_PARENTPORTID_OFFSET, 2, FALSE);
1093 proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_parentlastsyncsequencenumber,
1094 tvb, PTP_MM_PARENT_DATA_SET_PARENTLASTSYNCSEQUENCENUMBER_OFFSET,
1097 proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_parentfollowupcapable, tvb,
1098 PTP_MM_PARENT_DATA_SET_PARENTFOLLOWUPCAPABLE_OFFSET, 1, FALSE);
1100 proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_parentexternaltiming, tvb,
1101 PTP_MM_PARENT_DATA_SET_PARENTEXTERNALTIMING_OFFSET, 1, FALSE);
1103 proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_parentvariance, tvb,
1104 PTP_MM_PARENT_DATA_SET_PARENTVARIANCE_OFFSET, 2, FALSE);
1106 proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_parentstats, tvb,
1107 PTP_MM_PARENT_DATA_SET_PARENTSTATS_OFFSET, 1, FALSE);
1109 proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_observedvariance, tvb,
1110 PTP_MM_PARENT_DATA_SET_OBSERVEDVARIANCE_OFFSET, 2, FALSE);
1112 proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_observeddrift, tvb,
1113 PTP_MM_PARENT_DATA_SET_OBSERVEDDRIFT_OFFSET, 4, FALSE);
1115 proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_utcreasonable, tvb,
1116 PTP_MM_PARENT_DATA_SET_UTCREASONABLE_OFFSET, 1, FALSE);
1118 proto_tree_add_item(ptp_tree,
1119 hf_ptp_mm_parent_data_set_grandmastercommunicationtechnology,
1120 tvb, PTP_MM_PARENT_DATA_SET_GRANDMASTERCOMMUNICATIONTECHNOLOGY_OFFSET, 1,
1123 proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_grandmasteruuidfield, tvb,
1124 PTP_MM_PARENT_DATA_SET_GRANDMASTERUUIDFIELD_OFFSET, 6, FALSE);
1126 proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_grandmasterportidfield, tvb,
1127 PTP_MM_PARENT_DATA_SET_GRANDMASTERPORTIDFIELD_OFFSET, 2, FALSE);
1129 proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_grandmasterstratum, tvb,
1130 PTP_MM_PARENT_DATA_SET_GRANDMASTERSTRATUM_OFFSET, 1, FALSE);
1132 proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_grandmasteridentifier, tvb,
1133 PTP_MM_PARENT_DATA_SET_GRANDMASTERIDENTIFIER_OFFSET, 4, FALSE);
1135 proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_grandmastervariance, tvb,
1136 PTP_MM_PARENT_DATA_SET_GRANDMASTERVARIANCE_OFFSET, 2, FALSE);
1138 proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_grandmasterpreferred, tvb,
1139 PTP_MM_PARENT_DATA_SET_GRANDMASTERPREFERRED_OFFSET, 1, FALSE);
1141 proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_grandmasterisboundaryclock, tvb,
1142 PTP_MM_PARENT_DATA_SET_GRANDMASTERISBOUNDARYCLOCK_OFFSET, 1, FALSE);
1144 proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_grandmastersequencenumber, tvb,
1145 PTP_MM_PARENT_DATA_SET_GRANDMASTERSEQUENCENUMBER_OFFSET, 2, FALSE);
1148 case PTP_MM_PORT_DATA_SET:{
1149 proto_tree_add_item(ptp_tree, hf_ptp_mm_port_data_set_returnedportnumber, tvb,
1150 PTP_MM_PORT_DATA_SET_RETURNEDPORTNUMBER_OFFSET, 2, FALSE);
1152 proto_tree_add_item(ptp_tree, hf_ptp_mm_port_data_set_portstate, tvb,
1153 PTP_MM_PORT_DATA_SET_PORTSTATE_OFFSET, 1, FALSE);
1155 proto_tree_add_item(ptp_tree, hf_ptp_mm_port_data_set_lastsynceventsequencenumber, tvb,
1156 PTP_MM_PORT_DATA_SET_LASTSYNCEVENTSEQUENCENUMBER_OFFSET, 2, FALSE);
1158 proto_tree_add_item(ptp_tree, hf_ptp_mm_port_data_set_lastgeneraleventsequencenumber,
1159 tvb, PTP_MM_PORT_DATA_SET_LASTGENERALEVENTSEQUENCENUMBER_OFFSET,
1162 proto_tree_add_item(ptp_tree, hf_ptp_mm_port_data_set_portcommunicationtechnology, tvb,
1163 PTP_MM_PORT_DATA_SET_PORTCOMMUNICATIONTECHNOLOGY_OFFSET, 1, FALSE);
1165 proto_tree_add_item(ptp_tree, hf_ptp_mm_port_data_set_portuuidfield, tvb,
1166 PTP_MM_PORT_DATA_SET_PORTUUIDFIELD_OFFSET, 6, FALSE);
1168 proto_tree_add_item(ptp_tree, hf_ptp_mm_port_data_set_portidfield, tvb,
1169 PTP_MM_PORT_DATA_SET_PORTIDFIELD_OFFSET, 2, FALSE);
1171 proto_tree_add_item(ptp_tree, hf_ptp_mm_port_data_set_burstenabled, tvb,
1172 PTP_MM_PORT_DATA_SET_BURSTENABLED_OFFSET, 1, FALSE);
1174 proto_tree_add_item(ptp_tree, hf_ptp_mm_port_data_set_subdomainaddressoctets, tvb,
1175 PTP_MM_PORT_DATA_SET_SUBDOMAINADDRESSOCTETS_OFFSET, 1, FALSE);
1177 proto_tree_add_item(ptp_tree, hf_ptp_mm_port_data_set_eventportaddressoctets, tvb,
1178 PTP_MM_PORT_DATA_SET_EVENTPORTADDRESSOCTETS_OFFSET, 1, FALSE);
1180 proto_tree_add_item(ptp_tree, hf_ptp_mm_port_data_set_generalportaddressoctets, tvb,
1181 PTP_MM_PORT_DATA_SET_GENERALPORTADDRESSOCTETS_OFFSET, 1, FALSE);
1183 proto_tree_add_item(ptp_tree, hf_ptp_mm_port_data_set_subdomainaddress, tvb,
1184 PTP_MM_PORT_DATA_SET_SUBDOMAINADDRESS_OFFSET, 4, FALSE);
1186 proto_tree_add_item(ptp_tree, hf_ptp_mm_port_data_set_eventportaddress, tvb,
1187 PTP_MM_PORT_DATA_SET_EVENTPORTADDRESS_OFFSET, 2, FALSE);
1189 proto_tree_add_item(ptp_tree, hf_ptp_mm_port_data_set_generalportaddress, tvb,
1190 PTP_MM_PORT_DATA_SET_GENERALPORTADDRESS_OFFSET, 2, FALSE);
1193 case PTP_MM_GLOBAL_TIME_DATA_SET:{
1194 /* Subtree for local time*/
1195 ts.secs = tvb_get_ntohl(tvb, PTP_MM_GLOBAL_TIME_DATA_SET_LOCALTIMESECONDS_OFFSET);
1197 ts.nsecs = tvb_get_ntohl(tvb,
1198 PTP_MM_GLOBAL_TIME_DATA_SET_LOCALTIMENANOSECONDS_OFFSET);
1201 time_ti = proto_tree_add_time(ptp_tree,
1202 hf_ptp_mm_global_time_data_set_localtime, tvb,
1203 PTP_MM_GLOBAL_TIME_DATA_SET_LOCALTIME_OFFSET, 8, &ts);
1205 ptp_time_tree = proto_item_add_subtree(time_ti, ett_ptp_time);
1207 proto_tree_add_item(ptp_time_tree,
1208 hf_ptp_mm_global_time_data_set_localtimeseconds, tvb,
1209 PTP_MM_GLOBAL_TIME_DATA_SET_LOCALTIMESECONDS_OFFSET, 4, FALSE);
1211 proto_tree_add_item(ptp_time_tree,
1212 hf_ptp_mm_global_time_data_set_localtimenanoseconds,
1213 tvb, PTP_MM_GLOBAL_TIME_DATA_SET_LOCALTIMENANOSECONDS_OFFSET, 4, FALSE);
1216 proto_tree_add_item(ptp_tree, hf_ptp_mm_global_time_data_set_currentutcoffset, tvb,
1217 PTP_MM_GLOBAL_TIME_DATA_SET_CURRENTUTCOFFSET_OFFSET, 2, FALSE);
1219 proto_tree_add_item(ptp_tree, hf_ptp_mm_global_time_data_set_leap59, tvb,
1220 PTP_MM_GLOBAL_TIME_DATA_SET_LEAP59_OFFSET, 1, FALSE);
1222 proto_tree_add_item(ptp_tree, hf_ptp_mm_global_time_data_set_leap61, tvb,
1223 PTP_MM_GLOBAL_TIME_DATA_SET_LEAP61_OFFSET, 1, FALSE);
1225 proto_tree_add_item(ptp_tree, hf_ptp_mm_global_time_data_set_epochnumber, tvb,
1226 PTP_MM_GLOBAL_TIME_DATA_SET_EPOCHNUMBER_OFFSET, 2, FALSE);
1229 case PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES:{
1230 proto_tree_add_item(ptp_tree, hf_ptp_mm_update_global_time_properties_currentutcoffset,
1231 tvb, PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES_CURRENTUTCOFFSET_OFFSET,
1234 proto_tree_add_item(ptp_tree, hf_ptp_mm_update_global_time_properties_leap59, tvb,
1235 PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES_LEAP59_OFFSET, 1, FALSE);
1237 proto_tree_add_item(ptp_tree, hf_ptp_mm_update_global_time_properties_leap61, tvb,
1238 PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES_LEAP61_OFFSET, 1, FALSE);
1240 proto_tree_add_item(ptp_tree, hf_ptp_mm_get_foreign_data_set_recordkey, tvb,
1241 PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES_EPOCHNUMBER_OFFSET, 2, FALSE);
1244 case PTP_MM_GET_FOREIGN_DATA_SET:{
1245 proto_tree_add_item(ptp_tree, hf_ptp_mm_get_foreign_data_set_recordkey, tvb,
1246 PTP_MM_GET_FOREIGN_DATA_SET_RECORDKEY_OFFSET, 2, FALSE);
1249 case PTP_MM_FOREIGN_DATA_SET:{
1250 proto_tree_add_item(ptp_tree, hf_ptp_mm_foreign_data_set_returnedportnumber, tvb,
1251 PTP_MM_FOREIGN_DATA_SET_RETURNEDPORTNUMBER_OFFSET, 2, FALSE);
1253 proto_tree_add_item(ptp_tree, hf_ptp_mm_foreign_data_set_returnedrecordnumber, tvb,
1254 PTP_MM_FOREIGN_DATA_SET_RETURNEDRECORDNUMBER_OFFSET, 2, FALSE);
1256 proto_tree_add_item(ptp_tree,
1257 hf_ptp_mm_foreign_data_set_foreignmastercommunicationtechnology,
1258 tvb, PTP_MM_FOREIGN_DATA_SET_FOREIGNMASTERCOMMUNICATIONTECHNOLOGY_OFFSET, 1,
1261 proto_tree_add_item(ptp_tree, hf_ptp_mm_foreign_data_set_foreignmasteruuidfield, tvb,
1262 PTP_MM_FOREIGN_DATA_SET_FOREIGNMASTERUUIDFIELD_OFFSET, 6, FALSE);
1264 proto_tree_add_item(ptp_tree, hf_ptp_mm_foreign_data_set_foreignmasterportidfield, tvb,
1265 PTP_MM_FOREIGN_DATA_SET_FOREIGNMASTERPORTIDFIELD_OFFSET, 2, FALSE);
1267 proto_tree_add_item(ptp_tree, hf_ptp_mm_foreign_data_set_foreignmastersyncs, tvb,
1268 PTP_MM_FOREIGN_DATA_SET_FOREIGNMASTERSYNCS_OFFSET, 2, FALSE);
1271 case PTP_MM_SET_SYNC_INTERVAL:{
1272 proto_tree_add_item(ptp_tree, hf_ptp_mm_set_sync_interval_syncinterval, tvb,
1273 PTP_MM_SET_SYNC_INTERVAL_SYNCINTERVAL_OFFSET, 2, FALSE);
1276 case PTP_MM_SET_TIME:{
1277 /* Subtree for local time*/
1278 ts.secs = tvb_get_ntohl(tvb, PTP_MM_SET_TIME_LOCALTIMESECONDS_OFFSET);
1280 ts.nsecs = tvb_get_ntohl(tvb, PTP_MM_SET_TIME_LOCALTIMENANOSECONDS_OFFSET);
1283 time_ti = proto_tree_add_time(ptp_tree, hf_ptp_mm_set_time_localtime, tvb,
1284 PTP_MM_SET_TIME_LOCALTIME_OFFSET, 8, &ts);
1286 ptp_time_tree = proto_item_add_subtree(time_ti, ett_ptp_time);
1288 proto_tree_add_item(ptp_time_tree, hf_ptp_mm_set_time_localtimeseconds, tvb,
1289 PTP_MM_SET_TIME_LOCALTIMESECONDS_OFFSET, 4, FALSE);
1291 proto_tree_add_item(ptp_time_tree, hf_ptp_mm_set_time_localtimenanoseconds,
1292 tvb, PTP_MM_SET_TIME_LOCALTIMENANOSECONDS_OFFSET, 4, FALSE);
1297 /*- don't dissect any further. */
1304 /* Not a valid MessageType - can't dissect. */
1312 /* Register the protocol with Ethereal */
1315 proto_register_ptp(void)
1317 static hf_register_info hf[] = {
1318 /*Common Fields for all frames*/
1319 { &hf_ptp_versionptp,
1320 { "versionPTP", "ptp.versionptp",
1321 FT_UINT16, BASE_DEC, NULL, 0x00,
1324 { &hf_ptp_versionnetwork,
1325 { "versionNetwork", "ptp.versionnetwork",
1326 FT_UINT16, BASE_DEC, NULL, 0x00,
1329 { &hf_ptp_subdomain,
1330 { "subdomain", "ptp.subdomain",
1331 FT_STRING, BASE_DEC, NULL, 0x00,
1334 { &hf_ptp_messagetype,
1335 { "messageType", "ptp.messagetype",
1336 FT_UINT8, BASE_DEC, VALS(ptp_messagetype_vals), 0x00,
1339 { &hf_ptp_sourcecommunicationtechnology,
1340 { "sourceCommunicationTechnology", "ptp.sourcecommunicationtechnology",
1341 FT_UINT8, BASE_DEC, VALS(ptp_communicationid_vals), 0x00,
1344 { &hf_ptp_sourceuuid,
1345 { "sourceUuid", "ptp.sourceuuid",
1346 FT_ETHER, BASE_DEC, NULL, 0x00,
1349 { &hf_ptp_sourceportid,
1350 { "sourcePortId", "ptp.sourceportid",
1351 FT_UINT16, BASE_DEC, NULL, 0x00,
1354 { &hf_ptp_sequenceid,
1355 { "sequenceId", "ptp.sequenceid",
1356 FT_UINT16, BASE_DEC, NULL, 0x00,
1360 { "control", "ptp.control",
1361 FT_UINT8, BASE_DEC, VALS(ptp_control_vals), 0x00,
1366 { "flags", "ptp.flags",
1367 FT_UINT16, BASE_HEX, NULL, 0x00,
1370 { &hf_ptp_flags_li61,
1371 { "PTP_LI61", "ptp.flags.li61",
1372 FT_UINT16, BASE_DEC, VALS(ptp_bool_vals), PTP_FLAGS_LI61_BITMASK,
1375 { &hf_ptp_flags_li59,
1376 { "PTP_LI59", "ptp.flags.li59",
1377 FT_UINT16, BASE_DEC, VALS(ptp_bool_vals), PTP_FLAGS_LI59_BITMASK,
1380 { &hf_ptp_flags_boundary_clock,
1381 { "PTP_BOUNDARY_CLOCK", "ptp.flags.boundary_clock",
1382 FT_UINT16, BASE_DEC, VALS(ptp_bool_vals), PTP_FLAGS_BOUNDARY_CLOCK_BITMASK,
1385 { &hf_ptp_flags_assist,
1386 { "PTP_ASSIST", "ptp.flags.assist",
1387 FT_UINT16, BASE_DEC, VALS(ptp_bool_vals), PTP_FLAGS_ASSIST_BITMASK,
1390 { &hf_ptp_flags_ext_sync,
1391 { "PTP_EXT_SYNC", "ptp.flags.ext_sync",
1392 FT_UINT16, BASE_DEC, VALS(ptp_bool_vals), PTP_FLAGS_EXT_SYNC_BITMASK,
1395 { &hf_ptp_flags_parent,
1396 { "PTP_PARENT_STATS", "ptp.flags.parent_stats",
1397 FT_UINT16, BASE_DEC, VALS(ptp_bool_vals), PTP_FLAGS_PARENT_STATS_BITMASK,
1400 { &hf_ptp_flags_sync_burst,
1401 { "PTP_SYNC_BURST", "ptp.flags.sync_burst",
1402 FT_UINT16, BASE_DEC, VALS(ptp_bool_vals), PTP_FLAGS_SYNC_BURST_BITMASK,
1405 /*END OF THE FLAG-FIELD*/
1407 /*offsets for ptp_sync and delay_req (=sdr) messages*/
1408 { &hf_ptp_origintimestamp,
1409 { "originTimestamp", "ptp.sdr.origintimestamp",
1410 FT_RELATIVE_TIME, BASE_NONE, NULL, 0x00,
1413 { &hf_ptp_sdr_origintimestamp_seconds,
1414 { "originTimestamp (seconds)", "ptp.sdr.origintimestamp_seconds",
1415 FT_UINT32, BASE_DEC, NULL, 0x00,
1418 { &hf_ptp_sdr_origintimestamp_nanoseconds,
1419 { "originTimestamp (nanoseconds)", "ptp.sdr.origintimestamp_nanoseconds",
1420 FT_INT32, BASE_DEC, NULL, 0x00,
1423 { &hf_ptp_sdr_epochnumber,
1424 { "epochNumber", "ptp.sdr.epochnumber",
1425 FT_UINT16, BASE_DEC, NULL, 0x00,
1428 { &hf_ptp_sdr_currentutcoffset,
1429 { "currentUTCOffset", "ptp.sdr.currentutcoffset",
1430 FT_INT16, BASE_DEC, NULL, 0x00,
1433 { &hf_ptp_sdr_grandmastercommunicationtechnology,
1434 { "grandmasterCommunicationTechnology", "ptp.sdr.grandmastercommunicationtechnology",
1435 FT_UINT8, BASE_DEC, VALS(ptp_communicationid_vals), 0x00,
1438 { &hf_ptp_sdr_grandmasterclockuuid,
1439 { "grandMasterClockUuid", "ptp.sdr.grandmasterclockuuid",
1440 FT_ETHER, BASE_DEC, NULL, 0x00,
1443 { &hf_ptp_sdr_grandmasterportid,
1444 { "grandmasterPortId", "ptp.sdr.grandmasterportid",
1445 FT_UINT16, BASE_DEC, NULL, 0x00,
1448 { &hf_ptp_sdr_grandmastersequenceid,
1449 { "grandmasterSequenceId", "ptp.sdr.grandmastersequenceid",
1450 FT_UINT16, BASE_DEC, NULL, 0x00,
1453 { &hf_ptp_sdr_grandmasterclockstratum,
1454 { "grandmasterClockStratum", "ptp.sdr.grandmasterclockstratum",
1455 FT_UINT8, BASE_DEC, NULL, 0x00,
1458 { &hf_ptp_sdr_grandmasterclockidentifier,
1459 { "grandmasterClockIdentifier", "ptp.sdr.grandmasterclockidentifier",
1460 FT_STRING, BASE_DEC, NULL, 0x00,
1463 { &hf_ptp_sdr_grandmasterclockvariance,
1464 { "grandmasterClockVariance", "ptp.sdr.grandmasterclockvariance",
1465 FT_INT16, BASE_DEC, NULL, 0x00,
1468 { &hf_ptp_sdr_grandmasterpreferred,
1469 { "grandmasterPreferred", "ptp.sdr.grandmasterpreferred",
1470 FT_UINT8, BASE_DEC, NULL, 0x00,
1473 { &hf_ptp_sdr_grandmasterisboundaryclock,
1474 { "grandmasterIsBoundaryClock", "ptp.sdr.grandmasterisboundaryclock",
1475 FT_UINT8, BASE_DEC, NULL, 0x00,
1478 { &hf_ptp_sdr_syncinterval,
1479 { "syncInterval", "ptp.sdr.syncinterval",
1480 FT_INT8, BASE_DEC, NULL, 0x00,
1483 { &hf_ptp_sdr_localclockvariance,
1484 { "localClockVariance", "ptp.sdr.localclockvariance",
1485 FT_INT16, BASE_DEC, NULL, 0x00,
1488 { &hf_ptp_sdr_localstepsremoved,
1489 { "localStepsRemoved", "ptp.sdr.localstepsremoved",
1490 FT_UINT16, BASE_DEC, NULL, 0x00,
1493 { &hf_ptp_sdr_localclockstratum,
1494 { "localClockStratum", "ptp.sdr.localclockstratum",
1495 FT_UINT8, BASE_DEC, NULL, 0x00,
1498 { &hf_ptp_sdr_localclockidentifier,
1499 { "localClockIdentifier", "ptp.sdr.localclockidentifier",
1500 FT_STRING, BASE_DEC, NULL, 0x00,
1503 { &hf_ptp_sdr_parentcommunicationtechnology,
1504 { "parentCommunicationTechnology", "ptp.sdr.parentcommunicationtechnology",
1505 FT_UINT8, BASE_DEC, VALS(ptp_communicationid_vals), 0x00,
1508 { &hf_ptp_sdr_parentuuid,
1509 { "parentUuid", "ptp.sdr.parentuuid",
1510 FT_ETHER, BASE_DEC, NULL, 0x00,
1513 { &hf_ptp_sdr_parentportfield,
1514 { "parentPortField", "ptp.sdr.parentportfield",
1515 FT_UINT16, BASE_DEC, NULL, 0x00,
1518 { &hf_ptp_sdr_estimatedmastervariance,
1519 { "estimatedMasterVariance", "ptp.sdr.estimatedmastervariance",
1520 FT_INT16, BASE_DEC, NULL, 0x00,
1523 { &hf_ptp_sdr_estimatedmasterdrift,
1524 { "estimatedMasterDrift", "ptp.sdr.estimatedmasterdrift",
1525 FT_INT32, BASE_DEC, NULL, 0x00,
1528 { &hf_ptp_sdr_utcreasonable,
1529 { "utcReasonable", "ptp.sdr.utcreasonable",
1530 FT_BOOLEAN, BASE_DEC, NULL, 0x00,
1533 /*offsets for follow_up (=fu) messages*/
1534 { &hf_ptp_fu_associatedsequenceid,
1535 { "associatedSequenceId", "ptp.fu.associatedsequenceid",
1536 FT_UINT16, BASE_DEC, NULL, 0x00,
1539 { &hf_ptp_fu_preciseorigintimestamp,
1540 { "preciseOriginTimestamp", "ptp.fu.hf_ptp_fu_preciseorigintimestamp",
1541 FT_RELATIVE_TIME, BASE_NONE, NULL, 0x00,
1544 { &hf_ptp_fu_preciseorigintimestamp_seconds,
1545 { "preciseOriginTimestamp (seconds)", "ptp.fu.hf_ptp_fu_preciseorigintimestamp_seconds",
1546 FT_UINT32, BASE_DEC, NULL, 0x00,
1549 { &hf_ptp_fu_preciseorigintimestamp_nanoseconds,
1550 { "preciseOriginTimestamp (nanoseconds)", "ptp.fu.preciseorigintimestamp_nanoseconds",
1551 FT_INT32, BASE_DEC, NULL, 0x00,
1554 /*offsets for delay_resp (=dr) messages*/
1555 { &hf_ptp_dr_delayreceipttimestamp,
1556 { "delayReceiptTimestamp", "ptp.dr.delayreceipttimestamp",
1557 FT_RELATIVE_TIME, BASE_NONE, NULL, 0x00,
1560 { &hf_ptp_dr_delayreceipttimestamp_seconds,
1561 { "delayReceiptTimestamp (Seconds)", "ptp.dr.delayreceipttimestamp_seconds",
1562 FT_UINT32, BASE_DEC, NULL, 0x00,
1565 { &hf_ptp_dr_delayreceipttimestamp_nanoseconds,
1566 { "delayReceiptTimestamp (nanoseconds)", "ptp.dr.delayreceipttimestamp_nanoseconds",
1567 FT_INT32, BASE_DEC, NULL, 0x00,
1570 { &hf_ptp_dr_requestingsourcecommunicationtechnology,
1571 { "requestingSourceCommunicationTechnology", "ptp.dr.requestingsourcecommunicationtechnology",
1572 FT_UINT8, BASE_DEC, VALS(ptp_communicationid_vals), 0x00,
1575 { &hf_ptp_dr_requestingsourceuuid,
1576 { "requestingSourceUuid", "ptp.dr.requestingsourceuuid",
1577 FT_ETHER, BASE_DEC, NULL, 0x00,
1580 { &hf_ptp_dr_requestingsourceportid,
1581 { "requestingSourcePortId", "ptp.dr.requestingsourceportid",
1582 FT_UINT16, BASE_DEC, NULL, 0x00,
1585 { &hf_ptp_dr_requestingsourcesequenceid,
1586 { "requestingSourceSequenceId", "ptp.dr.requestingsourcesequenceid",
1587 FT_UINT16, BASE_DEC, NULL, 0x00,
1590 /*offsets for management (=mm) messages*/
1591 { &hf_ptp_mm_targetcommunicationtechnology,
1592 { "targetCommunicationTechnology", "ptp.mm.targetcommunicationtechnology",
1593 FT_UINT8, BASE_DEC, VALS(ptp_communicationid_vals), 0x00,
1596 { &hf_ptp_mm_targetuuid,
1597 { "targetUuid", "ptp.mm.targetuuid",
1598 FT_ETHER, BASE_DEC, NULL, 0x00,
1601 { &hf_ptp_mm_targetportid,
1602 { "targetPortId", "ptp.mm.targetportid",
1603 FT_UINT16, BASE_DEC, NULL, 0x00,
1606 { &hf_ptp_mm_boundaryhops,
1607 { "boundaryHops", "ptp.mm.boundaryhops",
1608 FT_INT16, BASE_DEC, NULL, 0x00,
1611 { &hf_ptp_mm_managementmessagekey,
1612 { "managementMessageKey", "ptp.mm.managementmessagekey",
1613 FT_UINT8, BASE_DEC, VALS(ptp_managementMessageKey_vals), 0x00,
1616 { &hf_ptp_mm_parameterlength,
1617 { "parameterLength", "ptp.mm.parameterlength",
1618 FT_UINT16, BASE_DEC, NULL, 0x00,
1621 /*parameterlength > 0*/
1622 { &hf_ptp_mm_messageparameters,
1623 { "messageParameters", "ptp.mm.messageparameters",
1624 FT_BYTES, BASE_DEC, NULL, 0x00,
1627 /*ptp_mm_clock_identity (parameterlength = 64)*/
1628 { &hf_ptp_mm_clock_identity_clockcommunicationtechnology,
1629 { "clockCommunicationTechnology", "ptp.mm.clock.identity.clockcommunicationtechnology",
1630 FT_UINT8, BASE_DEC, VALS(ptp_communicationid_vals), 0x00,
1633 { &hf_ptp_mm_clock_identity_clockuuidfield,
1634 { "clockUuidField", "ptp.mm.clock.identity.clockuuidfield",
1635 FT_ETHER, BASE_DEC, NULL, 0x00,
1638 { &hf_ptp_mm_clock_identity_clockportfield,
1639 { "clockPortField", "ptp.mm.clock.identity.clockportfield",
1640 FT_UINT16, BASE_DEC, NULL, 0x00,
1643 { &hf_ptp_mm_clock_identity_manufactureridentity,
1644 { "manufacturerIdentity", "ptp.mm.clock.identity.manufactureridentity",
1645 FT_BYTES, BASE_DEC, NULL, 0x00,
1649 /*ptp_mm_initialize_clock (parameterlength = 4)*/
1650 { &hf_ptp_mm_initialize_clock_initialisationkey,
1651 { "initialisationKey", "ptp.mm.initialize.clock.initialisationkey",
1652 FT_UINT16, BASE_DEC, NULL, 0x00,
1655 /*ptp_mm_set_subdomain (parameterlength = 16)*/
1656 { &hf_ptp_mm_set_subdomain_subdomainname,
1657 { "subdomainName", "ptp.mm.set.subdomain.subdomainname",
1658 FT_STRING, BASE_DEC, NULL, 0x00,
1661 /*ptp_mm_default_data_set (parameterlength = 76)*/
1662 { &hf_ptp_mm_default_data_set_clockcommunicationtechnology,
1663 { "clockCommunicationTechnology", "ptp.mm.default.data.set.clockcommunicationtechnology",
1664 FT_UINT8, BASE_DEC, VALS(ptp_communicationid_vals), 0x00,
1667 { &hf_ptp_mm_default_data_set_clockuuidfield,
1668 { "clockUuidField", "ptp.mm.default.data.set.clockuuidfield",
1669 FT_ETHER, BASE_DEC, NULL, 0x00,
1672 { &hf_ptp_mm_default_data_set_clockportfield,
1673 { "clockPortField", "ptp.mm.default.data.set.clockportfield",
1674 FT_UINT16, BASE_DEC, NULL, 0x00,
1677 { &hf_ptp_mm_default_data_set_clockstratum,
1678 { "clockStratum", "ptp.mm.default.data.set.clockstratum",
1679 FT_UINT8, BASE_DEC, NULL, 0x00,
1682 { &hf_ptp_mm_default_data_set_clockidentifier,
1683 { "clockIdentifier", "ptp.mm.default.data.set.clockidentifier",
1684 FT_BYTES, BASE_DEC, NULL, 0x00,
1687 { &hf_ptp_mm_default_data_set_clockvariance,
1688 { "clockVariance", "ptp.mm.default.data.set.clockvariance",
1689 FT_UINT16, BASE_DEC, NULL, 0x00,
1692 { &hf_ptp_mm_default_data_set_clockfollowupcapable,
1693 { "clockFollowupCapable", "ptp.mm.default.data.set.clockfollowupcapable",
1694 FT_BOOLEAN, BASE_DEC, NULL, 0x00,
1697 { &hf_ptp_mm_default_data_set_preferred,
1698 { "preferred", "ptp.mm.default.data.set.preferred",
1699 FT_BOOLEAN, BASE_DEC, NULL, 0x00,
1702 { &hf_ptp_mm_default_data_set_initializable,
1703 { "initializable", "ptp.mm.default.data.set.initializable",
1704 FT_BOOLEAN, BASE_DEC, NULL, 0x00,
1707 { &hf_ptp_mm_default_data_set_externaltiming,
1708 { "externalTiming", "ptp.mm.default.data.set.externaltiming",
1709 FT_BOOLEAN, BASE_DEC, NULL, 0x00,
1712 { &hf_ptp_mm_default_data_set_isboundaryclock,
1713 { "isBoundaryClock", "ptp.mm.default.data.set.isboundaryclock",
1714 FT_BOOLEAN, BASE_DEC, NULL, 0x00,
1717 { &hf_ptp_mm_default_data_set_syncinterval,
1718 { "syncInterval", "ptp.mm.default.data.set.syncinterval",
1719 FT_INT8, BASE_DEC, NULL, 0x00,
1722 { &hf_ptp_mm_default_data_set_subdomainname,
1723 { "subDomainName", "ptp.mm.default.data.set.subdomainname",
1724 FT_STRING, BASE_DEC, NULL, 0x00,
1727 { &hf_ptp_mm_default_data_set_numberports,
1728 { "numberPorts", "ptp.mm.default.data.set.numberports",
1729 FT_UINT16, BASE_DEC, NULL, 0x00,
1732 { &hf_ptp_mm_default_data_set_numberforeignrecords,
1733 { "numberForeignRecords", "ptp.mm.default.data.set.numberforeignrecords",
1734 FT_UINT16, BASE_DEC, NULL, 0x00,
1737 /*ptp_mm_update_default_data_set (parameterlength = 36)*/
1738 { &hf_ptp_mm_update_default_data_set_clockstratum,
1739 { "clockStratum", "ptp.mm.update.default.data.set.clockstratum",
1740 FT_UINT8, BASE_DEC, NULL, 0x00,
1743 { &hf_ptp_mm_update_default_data_set_clockidentifier,
1744 { "clockIdentifier", "ptp.mm.update.default.data.set.clockidentifier",
1745 FT_BYTES, BASE_DEC, NULL, 0x00,
1748 { &hf_ptp_mm_update_default_data_set_clockvariance,
1749 { "clockVariance", "ptp.mm.update.default.data.set.clockvariance",
1750 FT_UINT16, BASE_DEC, NULL, 0x00,
1753 { &hf_ptp_mm_update_default_data_set_preferred,
1754 { "preferred", "ptp.mm.update.default.data.set.preferred",
1755 FT_BOOLEAN, BASE_DEC, NULL, 0x00,
1758 { &hf_ptp_mm_update_default_data_set_syncinterval,
1759 { "syncInterval", "ptp.mm.update.default.data.set.syncinterval",
1760 FT_INT8, BASE_DEC, NULL, 0x00,
1763 { &hf_ptp_mm_update_default_data_set_subdomainname,
1764 { "subdomainName", "ptp.mm.update.default.data.set.subdomainname",
1765 FT_STRING, BASE_DEC, NULL, 0x00,
1768 /*ptp_mm_current_data_set (parameterlength = 20)*/
1769 { &hf_ptp_mm_current_data_set_stepsremoved,
1770 { "stepsRemoved", "ptp.mm.current.data.set.stepsremoved",
1771 FT_UINT16, BASE_DEC, NULL, 0x00,
1774 { &hf_ptp_mm_current_data_set_offsetfrommaster,
1775 { "offsetFromMaster", "ptp.mm.current.data.set.offsetfrommaster",
1776 FT_RELATIVE_TIME, BASE_NONE, NULL, 0x00,
1779 { &hf_ptp_mm_current_data_set_offsetfrommasterseconds,
1780 { "offsetFromMasterSeconds", "ptp.mm.current.data.set.offsetfrommasterseconds",
1781 FT_UINT32, BASE_DEC, NULL, 0x00,
1784 { &hf_ptp_mm_current_data_set_offsetfrommasternanoseconds,
1785 { "offsetFromMasterNanoseconds", "ptp.mm.current.data.set.offsetfrommasternanoseconds",
1786 FT_INT32, BASE_DEC, NULL, 0x00,
1789 { &hf_ptp_mm_current_data_set_onewaydelay,
1790 { "oneWayDelay", "ptp.mm.current.data.set.onewaydelay",
1791 FT_RELATIVE_TIME, BASE_NONE, NULL, 0x00,
1794 { &hf_ptp_mm_current_data_set_onewaydelayseconds,
1795 { "oneWayDelaySeconds", "ptp.mm.current.data.set.onewaydelayseconds",
1796 FT_UINT32, BASE_DEC, NULL, 0x00,
1799 { &hf_ptp_mm_current_data_set_onewaydelaynanoseconds,
1800 { "oneWayDelayNanoseconds", "ptp.mm.current.data.set.onewaydelaynanoseconds",
1801 FT_INT32, BASE_DEC, NULL, 0x00,
1804 /*ptp_mm_parent_data_set (parameterlength = 90)*/
1805 { &hf_ptp_mm_parent_data_set_parentcommunicationtechnology,
1806 { "parentCommunicationTechnology", "ptp.mm.parent.data.set.parentcommunicationtechnology",
1807 FT_UINT8, BASE_DEC, VALS(ptp_communicationid_vals), 0x00,
1810 { &hf_ptp_mm_parent_data_set_parentuuid,
1811 { "parentUuid", "ptp.mm.parent.data.set.parentuuid",
1812 FT_ETHER, BASE_DEC, NULL, 0x00,
1815 { &hf_ptp_mm_parent_data_set_parentportid,
1816 { "parentPortId", "ptp.mm.parent.data.set.parentportid",
1817 FT_UINT16, BASE_DEC, NULL, 0x00,
1820 { &hf_ptp_mm_parent_data_set_parentlastsyncsequencenumber,
1821 { "parentLastSyncSequenceNumber", "ptp.mm.parent.data.set.parentlastsyncsequencenumber",
1822 FT_UINT16, BASE_DEC, NULL, 0x00,
1825 { &hf_ptp_mm_parent_data_set_parentfollowupcapable,
1826 { "parentFollowupCapable", "ptp.mm.parent.data.set.parentfollowupcapable",
1827 FT_BOOLEAN, BASE_DEC, NULL, 0x00,
1830 { &hf_ptp_mm_parent_data_set_parentexternaltiming,
1831 { "parentExternalTiming", "ptp.mm.parent.data.set.parentexternaltiming",
1832 FT_BOOLEAN, BASE_DEC, NULL, 0x00,
1835 { &hf_ptp_mm_parent_data_set_parentvariance,
1836 { "parentVariance", "ptp.mm.parent.data.set.parentvariance",
1837 FT_UINT16, BASE_DEC, NULL, 0x00,
1840 { &hf_ptp_mm_parent_data_set_parentstats,
1841 { "parentStats", "ptp.mm.parent.data.set.parentstats",
1842 FT_BOOLEAN, BASE_DEC, NULL, 0x00,
1845 { &hf_ptp_mm_parent_data_set_observedvariance,
1846 { "observedVariance", "ptp.mm.parent.data.set.observedvariance",
1847 FT_INT16, BASE_DEC, NULL, 0x00,
1850 { &hf_ptp_mm_parent_data_set_observeddrift,
1851 { "observedDrift", "ptp.mm.parent.data.set.observeddrift",
1852 FT_INT32, BASE_DEC, NULL, 0x00,
1855 { &hf_ptp_mm_parent_data_set_utcreasonable,
1856 { "utcReasonable", "ptp.mm.parent.data.set.utcreasonable",
1857 FT_BOOLEAN, BASE_DEC, NULL, 0x00,
1860 { &hf_ptp_mm_parent_data_set_grandmastercommunicationtechnology,
1861 { "grandmasterCommunicationTechnology", "ptp.mm.parent.data.set.grandmastercommunicationtechnology",
1862 FT_UINT8, BASE_DEC, VALS(ptp_communicationid_vals), 0x00,
1865 { &hf_ptp_mm_parent_data_set_grandmasteruuidfield,
1866 { "grandmasterUuidField", "ptp.mm.parent.data.set.grandmasteruuidfield",
1867 FT_ETHER, BASE_DEC, NULL, 0x00,
1870 { &hf_ptp_mm_parent_data_set_grandmasterportidfield,
1871 { "grandmasterPortIdField", "ptp.mm.parent.data.set.grandmasterportidfield",
1872 FT_UINT16, BASE_DEC, NULL, 0x00,
1875 { &hf_ptp_mm_parent_data_set_grandmasterstratum,
1876 { "grandmasterStratum", "ptp.mm.parent.data.set.grandmasterstratum",
1877 FT_UINT8, BASE_DEC, NULL, 0x00,
1880 { &hf_ptp_mm_parent_data_set_grandmasteridentifier,
1881 { "grandmasterIdentifier", "ptp.mm.parent.data.set.grandmasteridentifier",
1882 FT_BYTES, BASE_DEC, NULL, 0x00,
1885 { &hf_ptp_mm_parent_data_set_grandmastervariance,
1886 { "grandmasterVariance", "ptp.mm.parent.data.set.grandmastervariance",
1887 FT_INT16, BASE_DEC, NULL, 0x00,
1890 { &hf_ptp_mm_parent_data_set_grandmasterpreferred,
1891 { "grandmasterPreferred", "ptp.mm.parent.data.set.grandmasterpreferred",
1892 FT_BOOLEAN, BASE_DEC, NULL, 0x00,
1895 { &hf_ptp_mm_parent_data_set_grandmasterisboundaryclock,
1896 { "grandmasterIsBoundaryClock", "ptp.mm.parent.data.set.grandmasterisboundaryclock",
1897 FT_BOOLEAN, BASE_DEC, NULL, 0x00,
1900 { &hf_ptp_mm_parent_data_set_grandmastersequencenumber,
1901 { "grandmasterSequenceNumber", "ptp.mm.parent.data.set.grandmastersequencenumber",
1902 FT_UINT16, BASE_DEC, NULL, 0x00,
1905 /*ptp_mm_port_data_set (parameterlength = 52)*/
1906 { &hf_ptp_mm_port_data_set_returnedportnumber,
1907 { "returnedPortNumber", "ptp.mm.port.data.set.returnedportnumber",
1908 FT_UINT16, BASE_DEC, NULL, 0x00,
1911 { &hf_ptp_mm_port_data_set_portstate,
1912 { "portState", "ptp.mm.port.data.set.portstate",
1913 FT_UINT8, BASE_DEC, NULL, 0x00,
1916 { &hf_ptp_mm_port_data_set_lastsynceventsequencenumber,
1917 { "lastSyncEventSequenceNumber", "ptp.mm.port.data.set.lastsynceventsequencenumber",
1918 FT_UINT16, BASE_DEC, NULL, 0x00,
1921 { &hf_ptp_mm_port_data_set_lastgeneraleventsequencenumber,
1922 { "lastGeneralEventSequenceNumber", "ptp.mm.port.data.set.lastgeneraleventsequencenumber",
1923 FT_UINT16, BASE_DEC, NULL, 0x00,
1926 { &hf_ptp_mm_port_data_set_portcommunicationtechnology,
1927 { "portCommunicationTechnology", "ptp.mm.port.data.set.portcommunicationtechnology",
1928 FT_UINT8, BASE_DEC, VALS(ptp_communicationid_vals), 0x00,
1931 { &hf_ptp_mm_port_data_set_portuuidfield,
1932 { "portUuidField", "ptp.mm.port.data.set.portuuidfield",
1933 FT_ETHER, BASE_DEC, NULL, 0x00,
1936 { &hf_ptp_mm_port_data_set_portidfield,
1937 { "portIdField", "ptp.mm.port.data.set.portidfield",
1938 FT_UINT16, BASE_DEC, NULL, 0x00,
1941 { &hf_ptp_mm_port_data_set_burstenabled,
1942 { "burstEnabled", "ptp.mm.port.data.set.burstenabled",
1943 FT_BOOLEAN, BASE_DEC, NULL, 0x00,
1946 { &hf_ptp_mm_port_data_set_subdomainaddressoctets,
1947 { "subdomainAddressOctets", "ptp.mm.port.data.set.subdomainaddressoctets",
1948 FT_UINT8, BASE_DEC, NULL, 0x00,
1951 { &hf_ptp_mm_port_data_set_eventportaddressoctets,
1952 { "eventPortAddressOctets", "ptp.mm.port.data.set.eventportaddressoctets",
1953 FT_UINT8, BASE_DEC, NULL, 0x00,
1956 { &hf_ptp_mm_port_data_set_generalportaddressoctets,
1957 { "generalPortAddressOctets", "ptp.mm.port.data.set.generalportaddressoctets",
1958 FT_UINT8, BASE_DEC, NULL, 0x00,
1961 { &hf_ptp_mm_port_data_set_subdomainaddress,
1962 { "subdomainAddress", "ptp.mm.port.data.set.subdomainaddress",
1963 FT_BYTES, BASE_DEC, NULL, 0x00,
1966 { &hf_ptp_mm_port_data_set_eventportaddress,
1967 { "eventPortAddress", "ptp.mm.port.data.set.eventportaddress",
1968 FT_BYTES, BASE_DEC, NULL, 0x00,
1971 { &hf_ptp_mm_port_data_set_generalportaddress,
1972 { "generalPortAddress", "ptp.mm.port.data.set.generalportaddress",
1973 FT_BYTES, BASE_DEC, NULL, 0x00,
1976 /*ptp_mm_global_time_data_set (parameterlength = 24)*/
1977 { &hf_ptp_mm_global_time_data_set_localtime,
1978 { "localTime", "ptp.mm.global.time.data.set.localtime",
1979 FT_RELATIVE_TIME, BASE_NONE, NULL, 0x00,
1982 { &hf_ptp_mm_global_time_data_set_localtimeseconds,
1983 { "localTimeSeconds", "ptp.mm.global.time.data.set.localtimeseconds",
1984 FT_UINT32, BASE_DEC, NULL, 0x00,
1987 { &hf_ptp_mm_global_time_data_set_localtimenanoseconds,
1988 { "localTimeNanoseconds", "ptp.mm.global.time.data.set.localtimenanoseconds",
1989 FT_INT32, BASE_DEC, NULL, 0x00,
1992 { &hf_ptp_mm_global_time_data_set_currentutcoffset,
1993 { "currentUtcOffset", "ptp.mm.global.time.data.set.currentutcoffset",
1994 FT_INT16, BASE_DEC, NULL, 0x00,
1997 { &hf_ptp_mm_global_time_data_set_leap59,
1998 { "leap59", "ptp.mm.global.time.data.set.leap59",
1999 FT_BOOLEAN, BASE_DEC, NULL, 0x00,
2002 { &hf_ptp_mm_global_time_data_set_leap61,
2003 { "leap61", "ptp.mm.global.time.data.set.leap61",
2004 FT_BOOLEAN, BASE_DEC, NULL, 0x00,
2007 { &hf_ptp_mm_global_time_data_set_epochnumber,
2008 { "epochNumber", "ptp.mm.global.time.data.set.epochnumber",
2009 FT_UINT16, BASE_DEC, NULL, 0x00,
2012 /*ptp_mm_update_global_time_properties (parameterlength = 16)*/
2013 { &hf_ptp_mm_update_global_time_properties_currentutcoffset,
2014 { "currentUtcOffset", "ptp.mm.update.global.time.properties.currentutcoffset",
2015 FT_UINT16, BASE_DEC, NULL, 0x00,
2018 { &hf_ptp_mm_update_global_time_properties_leap59,
2019 { "leap59", "ptp.mm.update.global.time.properties.leap59",
2020 FT_BOOLEAN, BASE_DEC, NULL, 0x00,
2023 { &hf_ptp_mm_update_global_time_properties_leap61,
2024 { "leap61", "ptp.mm.update.global.time.properties.leap61",
2025 FT_BOOLEAN, BASE_DEC, NULL, 0x00,
2028 { &hf_ptp_mm_update_global_time_properties_epochnumber,
2029 { "epochNumber", "ptp.mm.update.global.time.properties.epochnumber",
2030 FT_UINT16, BASE_DEC, NULL, 0x00,
2033 /*ptp_mm_get_foreign_data_set (parameterlength = 4)*/
2034 { &hf_ptp_mm_get_foreign_data_set_recordkey,
2035 { "recordKey", "ptp.mm.get.foreign.data.set.recordkey",
2036 FT_UINT16, BASE_DEC, NULL, 0x00,
2039 /*ptp_mm_foreign_data_set (parameterlength = 28)*/
2040 { &hf_ptp_mm_foreign_data_set_returnedportnumber,
2041 { "returnedPortNumber", "ptp.mm.foreign.data.set.returnedportnumber",
2042 FT_UINT16, BASE_DEC, NULL, 0x00,
2045 { &hf_ptp_mm_foreign_data_set_returnedrecordnumber,
2046 { "returnedRecordNumber", "ptp.mm.foreign.data.set.returnedrecordnumber",
2047 FT_UINT16, BASE_DEC, NULL, 0x00,
2050 { &hf_ptp_mm_foreign_data_set_foreignmastercommunicationtechnology,
2051 { "foreignMasterCommunicationTechnology",
2052 "ptp.mm.foreign.data.set.foreignmastercommunicationtechnology",
2053 FT_UINT8, BASE_DEC, VALS(ptp_communicationid_vals), 0x00,
2056 { &hf_ptp_mm_foreign_data_set_foreignmasteruuidfield,
2057 { "foreignMasterUuidField", "ptp.mm.foreign.data.set.foreignmasteruuidfield",
2058 FT_ETHER, BASE_DEC, NULL, 0x00,
2061 { &hf_ptp_mm_foreign_data_set_foreignmasterportidfield,
2062 { "foreignMasterPortIdField", "ptp.mm.foreign.data.set.foreignmasterportidfield",
2063 FT_UINT16, BASE_DEC, NULL, 0x00,
2066 { &hf_ptp_mm_foreign_data_set_foreignmastersyncs,
2067 { "foreignMasterSyncs", "ptp.mm.foreign.data.set.foreignmastersyncs",
2068 FT_UINT16, BASE_DEC, NULL, 0x00,
2071 /*ptp_mm_set_sync_interval (parameterlength = 4)*/
2072 { &hf_ptp_mm_set_sync_interval_syncinterval,
2073 { "syncInterval", "ptp.mm.set.sync.interval.syncinterval",
2074 FT_UINT16, BASE_DEC, NULL, 0x00,
2077 /*ptp_mm_set_time (parameterlength = 8)*/
2078 { &hf_ptp_mm_set_time_localtime,
2079 { "localtime", "ptp.mm.set.time.localtime",
2080 FT_RELATIVE_TIME, BASE_NONE, NULL, 0x00,
2083 { &hf_ptp_mm_set_time_localtimeseconds,
2084 { "localtimeSeconds", "ptp.mm.set.time.localtimeseconds",
2085 FT_UINT32, BASE_DEC, NULL, 0x00,
2088 { &hf_ptp_mm_set_time_localtimenanoseconds,
2089 { "localTimeNanoseconds", "ptp.mm.set.time.localtimenanoseconds",
2090 FT_INT32, BASE_DEC, NULL, 0x0,
2095 /* Setup protocol subtree array */
2096 static gint *ett[] = {
2103 /* Register the protocol name and description */
2104 proto_ptp = proto_register_protocol("Precision Time Protocol (IEEE1588)",
2107 /* Required function calls to register the header fields and subtrees used */
2108 proto_register_field_array(proto_ptp, hf, array_length(hf));
2109 proto_register_subtree_array(ett, array_length(ett));
2113 proto_reg_handoff_ptp(void)
2115 dissector_handle_t event_port_ptp_handle;
2116 dissector_handle_t general_port_ptp_handle;
2118 event_port_ptp_handle = create_dissector_handle(dissect_ptp,
2120 general_port_ptp_handle = create_dissector_handle(dissect_ptp,
2123 dissector_add("udp.port", EVENT_PORT_PTP, event_port_ptp_handle);
2124 dissector_add("udp.port", GENERAL_PORT_PTP, general_port_ptp_handle);