Win32 only: Preference setting to open a console window, one of:
[metze/wireshark/wip.git] / packet-ptp.c
1 /* packet-ptp.c
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>
6  *
7  * A plugin for:
8  *
9  * Ethereal - Network traffic analyzer
10  * By Gerald Combs <gerald@ethereal.com>
11  * Copyright 1998 Gerald Combs
12  *
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.
17  *
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.
22  *
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.
26  */
27
28 #ifdef HAVE_CONFIG_H
29 # include "config.h"
30 #endif
31
32 #include <stdio.h>
33 #include <stdlib.h>
34 #include <string.h>
35
36 #include <glib.h>
37
38 #ifdef NEED_SNPRINTF_H
39 # include "snprintf.h"
40 #endif
41
42 #include <epan/packet.h>
43
44
45 /**********************************************************/
46 /* Port definition's for PTP                                                      */
47 /**********************************************************/
48 #define EVENT_PORT_PTP      319
49 #define GENERAL_PORT_PTP    320
50
51 /*END Port definition's for PTP*/
52
53 /**********************************************************/
54 /* Offsets of fields within a PTP packet.                                 */
55 /**********************************************************/
56
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
75
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
102
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
108
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
117
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
132
133         /*PTP_MM_INITIALIZE_CLOCK (PARAMETERLENGTH = 4)*/
134 #define PTP_MM_INITIALIZE_CLOCK_INITIALISATIONKEY_OFFSET                        62
135
136         /*PTP_MM_SET_SUBDOMAIN (PARAMETERLENGTH = 16)*/
137 #define PTP_MM_SET_SUBDOMAIN_SUBDOMAINNAME_OFFSET                                       60
138
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
155
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
163
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
172
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
194
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
210
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
219
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
225
226         /*PTP_MM_GET_FOREIGN_DATA_SET (PARAMETERLENGTH = 4)*/
227 #define PTP_MM_GET_FOREIGN_DATA_SET_RECORDKEY_OFFSET                            62
228
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
236
237         /*PTP_MM_SET_SYNC_INTERVAL (PARAMETERLENGTH = 4)*/
238 #define PTP_MM_SET_SYNC_INTERVAL_SYNCINTERVAL_OFFSET                            62
239
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
244
245 /*END Offsets of fields within a PTP packet.*/
246
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
257
258 /*END flag-field-mask-definitions*/
259
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
291
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"},
321   {0,              NULL          } };
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"},
352   {0,              NULL          } };
353
354 /*END managementMessage definitions*/
355
356 /**********************************************************/
357 /* CommunicationId definitions                                                    */
358 /**********************************************************/
359 #define PTP_CLOSED                              0
360 #define PTP_ETHER                               1
361 #define PTP_FFBUS                               4
362 #define PTP_PROFIBUS                    5
363 #define PTP_LON                                 6
364 #define PTP_DNET                                7
365 #define PTP_SDS                                 8
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
376 #define PTP_USB                                 251
377 #define PTP_ISA                                 252
378 #define PTP_PCI                                 253
379 #define PTP_VXI                                 254
380 #define PTP_DEFAULT                             255
381
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"},
405   {0,              NULL          } };
406
407 /*END CommunicationId definitions*/
408
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
417
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"},
424   {0,              NULL          } };
425
426 /*END PTP message types*/
427
428 /**********************************************************/
429 /* Channel values for the PTP_MESSAGETYPE field                   */
430 /**********************************************************/
431 #define PTP_MESSAGETYPE_EVENT   0x01
432 #define PTP_MESSAGETYPE_GENERAL 0x02
433
434 static const value_string ptp_messagetype_vals[] = {
435   {PTP_MESSAGETYPE_EVENT, "Event Message"},
436   {PTP_MESSAGETYPE_GENERAL, "General Message"},
437   {0,              NULL          } };
438
439 /*END channel values for the PTP_MESSAGETYPE field*/
440
441 /* Channel values for boolean vals (FLAGS)*/
442
443 static const value_string ptp_bool_vals[] = {
444   {1, "True"},
445   {0, "False"},
446   {0,              NULL          }};
447
448 /**********************************************************/
449 /* Initialize the protocol and registered fields                  */
450 /**********************************************************/
451
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;
470
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;
497
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;
503
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;
512
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;
527
528         /*ptp_mm_initialize_clock (parameterlength = 4)*/
529 static int hf_ptp_mm_initialize_clock_initialisationkey = -1;
530
531         /*ptp_mm_set_subdomain (parameterlength = 16)*/
532 static int hf_ptp_mm_set_subdomain_subdomainname = -1;
533
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;
550
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;
558
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;
567
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;
589
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;
605
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;
614
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;
620
621         /*ptp_mm_get_foreign_data_set (parameterlength = 4)*/
622 static int hf_ptp_mm_get_foreign_data_set_recordkey = -1;
623
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;
631
632         /*ptp_mm_set_sync_interval (parameterlength = 4)*/
633 static int hf_ptp_mm_set_sync_interval_syncinterval = -1;
634
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;
639
640 /*END Initialize the protocol and registered fields */
641
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;
647
648
649 /* Code to actually dissect the packets */
650 static void
651 dissect_ptp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
652 {
653         guint8  ptp_control, ptp_mm_messagekey = 0;
654         nstime_t ts;    /*time structure with seconds and nanoseconds*/
655
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;
659
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");
663
664
665 /* Get control field (what kind of message is this? (Sync, DelayReq, ....) */
666
667         ptp_control = tvb_get_guint8 (tvb, PTP_CONTROL_OFFSET);
668         /* MGMT packet? */
669         if ( ptp_control == PTP_MANAGEMENT_MESSAGE ){
670                 /* Get the managementMessageKey */
671                         ptp_mm_messagekey = tvb_get_guint8(tvb, PTP_MM_MANAGEMENTMESSAGEKEY_OFFSET);
672         }
673
674 /* Create and set the string for "Info" column */
675         switch(ptp_control){
676                 case PTP_SYNC_MESSAGE:{
677                         if (check_col(pinfo->cinfo, COL_INFO))
678                                 col_set_str(pinfo->cinfo, COL_INFO, "Sync Message");
679                         break;
680                 }
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");
684                         break;
685                 }
686                 case PTP_FOLLOWUP_MESSAGE:{
687                         if (check_col(pinfo->cinfo, COL_INFO))
688                                 col_set_str(pinfo->cinfo, COL_INFO, "Follow_Up Message");
689                         break;
690                 }
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");
694                         break;
695                 }
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"));
702                         }
703                         break;
704                 }
705                 default:{
706                         if (check_col(pinfo->cinfo, COL_INFO))
707                                 col_add_str(pinfo->cinfo, COL_INFO, "Unknown Message");
708                         break;
709                 }
710         }
711
712         if (tree) {
713
714                 /* create display subtree for the protocol */
715                 ti = proto_tree_add_item(tree, proto_ptp, tvb, 0, -1, FALSE);
716
717                 ptp_tree = proto_item_add_subtree(ti, ett_ptp);
718
719                 proto_tree_add_item(ptp_tree,
720                     hf_ptp_versionptp, tvb, PTP_VERSIONPTP_OFFSET, 2, FALSE);
721
722                 proto_tree_add_item(ptp_tree,
723                     hf_ptp_versionnetwork, tvb, PTP_VERSIONNETWORK_OFFSET, 2, FALSE);
724
725                 proto_tree_add_item(ptp_tree,
726                     hf_ptp_subdomain, tvb, PTP_SUBDOMAIN_OFFSET, 16, FALSE);
727
728                 proto_tree_add_item(ptp_tree,
729                     hf_ptp_messagetype, tvb, PTP_MESSAGETYPE_OFFSET, 1, FALSE);
730
731                 proto_tree_add_item(ptp_tree,
732                     hf_ptp_sourcecommunicationtechnology, tvb, PTP_SOURCECOMMUNICATIONTECHNOLOGY_OFFSET, 1, FALSE);
733
734                 proto_tree_add_item(ptp_tree,
735                     hf_ptp_sourceuuid, tvb, PTP_SOURCEUUID_OFFSET, 6, FALSE);
736
737                 proto_tree_add_item(ptp_tree,
738                     hf_ptp_sourceportid, tvb, PTP_SOURCEPORTID_OFFSET, 2, FALSE);
739
740                 proto_tree_add_item(ptp_tree,
741                     hf_ptp_sequenceid, tvb, PTP_SEQUENCEID_OFFSET, 2, FALSE);
742
743                 proto_tree_add_item(ptp_tree,
744                     hf_ptp_control, tvb, PTP_CONTROL_OFFSET, 1, FALSE);
745
746                 /*Subtree for the flag-field*/
747                 if(tree){
748                         flags_ti = proto_tree_add_item(ptp_tree,
749                         hf_ptp_flags, tvb, PTP_FLAGS_OFFSET, 2, FALSE);
750
751                         ptp_flags_tree = proto_item_add_subtree(flags_ti, ett_ptp_flags);
752
753                         proto_tree_add_item(ptp_flags_tree,
754                         hf_ptp_flags_li61, tvb, PTP_FLAGS_LI61_OFFSET, 2, FALSE);
755
756                         proto_tree_add_item(ptp_flags_tree,
757                         hf_ptp_flags_li59, tvb, PTP_FLAGS_LI59_OFFSET, 2, FALSE);
758
759                         proto_tree_add_item(ptp_flags_tree,
760                         hf_ptp_flags_boundary_clock, tvb, PTP_FLAGS_BOUNDARY_CLOCK_OFFSET, 2, FALSE);
761
762                         proto_tree_add_item(ptp_flags_tree,
763                         hf_ptp_flags_assist, tvb, PTP_FLAGS_ASSIST_OFFSET, 2, FALSE);
764
765                         proto_tree_add_item(ptp_flags_tree,
766                                 hf_ptp_flags_ext_sync, tvb, PTP_FLAGS_EXT_SYNC_OFFSET, 2, FALSE);
767
768                         proto_tree_add_item(ptp_flags_tree,
769                         hf_ptp_flags_parent, tvb, PTP_FLAGS_PARENT_STATS_OFFSET, 2, FALSE);
770
771                         proto_tree_add_item(ptp_flags_tree,
772                         hf_ptp_flags_sync_burst, tvb, PTP_FLAGS_SYNC_BURST_OFFSET, 2, FALSE);
773                 }
774
775                 /* The rest of the ptp-dissector depends on the control-field  */
776
777                 switch(ptp_control){
778                         case PTP_SYNC_MESSAGE:
779                         case PTP_DELAY_REQ_MESSAGE:{
780
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);
784                         if(tree){
785                                 time_ti = proto_tree_add_time(ptp_tree,
786                                 hf_ptp_origintimestamp, tvb, PTP_SDR_ORIGINTIMESTAMP_OFFSET, 8, &ts);
787
788                                 ptp_time_tree = proto_item_add_subtree(time_ti, ett_ptp_time);
789
790                                 proto_tree_add_item(ptp_time_tree,
791                                                 hf_ptp_sdr_origintimestamp_seconds, tvb,
792                                                 PTP_SDR_ORIGINTIMESTAMP_SECONDS_OFFSET, 4, FALSE);
793
794                                         proto_tree_add_item(ptp_time_tree, hf_ptp_sdr_origintimestamp_nanoseconds, tvb,
795                                                         PTP_SDR_ORIGINTIMESTAMP_NANOSECONDS_OFFSET, 4, FALSE);
796                                 }
797
798                                 proto_tree_add_item(ptp_tree,
799                                                 hf_ptp_sdr_epochnumber, tvb, PTP_SDR_EPOCHNUMBER_OFFSET, 2, FALSE);
800
801                                 proto_tree_add_item(ptp_tree,
802                                     hf_ptp_sdr_currentutcoffset, tvb, PTP_SDR_CURRENTUTCOFFSET_OFFSET, 2, FALSE);
803
804                                 proto_tree_add_item(ptp_tree, hf_ptp_sdr_grandmastercommunicationtechnology, tvb,
805                                                 PTP_SDR_GRANDMASTERCOMMUNICATIONTECHNOLOGY_OFFSET, 1, FALSE);
806
807                                 proto_tree_add_item(ptp_tree,
808                                     hf_ptp_sdr_grandmasterclockuuid, tvb, PTP_SDR_GRANDMASTERCLOCKUUID_OFFSET, 6, FALSE);
809
810                                 proto_tree_add_item(ptp_tree,
811                                     hf_ptp_sdr_grandmasterportid, tvb, PTP_SDR_GRANDMASTERPORTID_OFFSET, 2, FALSE);
812
813                                 proto_tree_add_item(ptp_tree,
814                                     hf_ptp_sdr_grandmastersequenceid, tvb, PTP_SDR_GRANDMASTERSEQUENCEID_OFFSET, 2, FALSE);
815
816                                 proto_tree_add_item(ptp_tree,
817                                     hf_ptp_sdr_grandmasterclockstratum, tvb,
818                                                 PTP_SDR_GRANDMASTERCLOCKSTRATUM_OFFSET, 1, FALSE);
819
820                                 proto_tree_add_item(ptp_tree, hf_ptp_sdr_grandmasterclockidentifier, tvb,
821                                                 PTP_SDR_GRANDMASTERCLOCKIDENTIFIER_OFFSET, 4, FALSE);
822
823                                 proto_tree_add_item(ptp_tree,
824                                     hf_ptp_sdr_grandmasterclockvariance, tvb,
825                                                 PTP_SDR_GRANDMASTERCLOCKVARIANCE_OFFSET, 2, FALSE);
826
827                                 proto_tree_add_item(ptp_tree,
828                                     hf_ptp_sdr_grandmasterpreferred, tvb, PTP_SDR_GRANDMASTERPREFERRED_OFFSET, 1, FALSE);
829
830                                 proto_tree_add_item(ptp_tree, hf_ptp_sdr_grandmasterisboundaryclock, tvb,
831                                                 PTP_SDR_GRANDMASTERISBOUNDARYCLOCK_OFFSET, 1, FALSE);
832
833                                 proto_tree_add_item(ptp_tree,
834                                     hf_ptp_sdr_syncinterval, tvb, PTP_SDR_SYNCINTERVAL_OFFSET, 1, FALSE);
835
836                                 proto_tree_add_item(ptp_tree,
837                                     hf_ptp_sdr_localclockvariance, tvb, PTP_SDR_LOCALCLOCKVARIANCE_OFFSET, 2, FALSE);
838
839                                 proto_tree_add_item(ptp_tree,
840                                     hf_ptp_sdr_localstepsremoved, tvb, PTP_SDR_LOCALSTEPSREMOVED_OFFSET, 2, FALSE);
841
842                                 proto_tree_add_item(ptp_tree,
843                                     hf_ptp_sdr_localclockstratum, tvb, PTP_SDR_LOCALCLOCKSTRATUM_OFFSET, 1, FALSE);
844
845                                 proto_tree_add_item(ptp_tree,
846                                     hf_ptp_sdr_localclockidentifier, tvb, PTP_SDR_LOCALCLOCKIDENTIFIER_OFFSET, 4, FALSE);
847
848                                 proto_tree_add_item(ptp_tree, hf_ptp_sdr_parentcommunicationtechnology, tvb,
849                                                 PTP_SDR_PARENTCOMMUNICATIONTECHNOLOGY_OFFSET, 1, FALSE);
850
851                                 proto_tree_add_item(ptp_tree,
852                                     hf_ptp_sdr_parentuuid, tvb, PTP_SDR_PARENTUUID_OFFSET, 6, FALSE);
853
854                                 proto_tree_add_item(ptp_tree,
855                                     hf_ptp_sdr_parentportfield, tvb, PTP_SDR_PARENTPORTFIELD_OFFSET, 2, FALSE);
856
857                                 proto_tree_add_item(ptp_tree,
858                                     hf_ptp_sdr_estimatedmastervariance, tvb,
859                                                 PTP_SDR_ESTIMATEDMASTERVARIANCE_OFFSET, 2, FALSE);
860
861                                 proto_tree_add_item(ptp_tree,
862                                     hf_ptp_sdr_estimatedmasterdrift, tvb, PTP_SDR_ESTIMATEDMASTERDRIFT_OFFSET, 4, FALSE);
863
864                                 proto_tree_add_item(ptp_tree,
865                                     hf_ptp_sdr_utcreasonable, tvb, PTP_SDR_UTCREASONABLE_OFFSET, 1, FALSE);
866                                 break;
867                         }
868                         case PTP_FOLLOWUP_MESSAGE:{
869                                 proto_tree_add_item(ptp_tree,
870                                     hf_ptp_fu_associatedsequenceid, tvb, PTP_FU_ASSOCIATEDSEQUENCEID_OFFSET, 2, FALSE);
871
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);
875                                 if(tree){
876                                         time_ti = proto_tree_add_time(ptp_tree,
877                                                 hf_ptp_fu_preciseorigintimestamp, tvb,
878                                                         PTP_FU_PRECISEORIGINTIMESTAMP_OFFSET, 8, &ts);
879
880                                         ptp_time_tree = proto_item_add_subtree(time_ti, ett_ptp_time);
881
882                                         proto_tree_add_item(ptp_time_tree, hf_ptp_fu_preciseorigintimestamp_seconds, tvb,
883                                                         PTP_FU_PRECISEORIGINTIMESTAMP_SECONDS_OFFSET, 4, FALSE);
884
885                                         proto_tree_add_item(ptp_time_tree, hf_ptp_fu_preciseorigintimestamp_nanoseconds, tvb,
886                                                         PTP_FU_PRECISEORIGINTIMESTAMP_NANOSECONDS_OFFSET, 4, FALSE);
887                                 }
888                                 break;
889                         }
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);
894                                 if(tree){
895                                         time_ti = proto_tree_add_time(ptp_tree,
896                                                 hf_ptp_dr_delayreceipttimestamp, tvb,
897                                                         PTP_DR_DELAYRECEIPTTIMESTAMP_OFFSET, 8, &ts);
898
899                                         ptp_time_tree = proto_item_add_subtree(time_ti, ett_ptp_time);
900
901                                         proto_tree_add_item(ptp_time_tree, hf_ptp_dr_delayreceipttimestamp_seconds, tvb,
902                                                         PTP_DR_DELAYRECEIPTTIMESTAMP_SECONDS_OFFSET, 4, FALSE);
903
904                                         proto_tree_add_item(ptp_time_tree, hf_ptp_dr_delayreceipttimestamp_nanoseconds, tvb,
905                                                         PTP_DR_DELAYRECEIPTTIMESTAMP_NANOSECONDS_OFFSET, 4, FALSE);
906                                 }
907
908                                 proto_tree_add_item(ptp_tree, hf_ptp_dr_requestingsourcecommunicationtechnology, tvb,
909                                         PTP_DR_REQUESTINGSOURCECOMMUNICATIONTECHNOLOGY_OFFSET, 1, FALSE);
910
911                                 proto_tree_add_item(ptp_tree,
912                                     hf_ptp_dr_requestingsourceuuid, tvb, PTP_DR_REQUESTINGSOURCEUUID_OFFSET, 6, FALSE);
913
914                                 proto_tree_add_item(ptp_tree,
915                                     hf_ptp_dr_requestingsourceportid, tvb, PTP_DR_REQUESTINGSOURCEPORTID_OFFSET, 2, FALSE);
916
917                                 proto_tree_add_item(ptp_tree,
918                                     hf_ptp_dr_requestingsourcesequenceid, tvb,
919                                                 PTP_DR_REQUESTINGSOURCESEQUENCEID_OFFSET, 2, FALSE);
920                                 break;
921                         }
922                         case PTP_MANAGEMENT_MESSAGE:{
923                                 proto_tree_add_item(ptp_tree, hf_ptp_mm_targetcommunicationtechnology, tvb,
924                                                 PTP_MM_TARGETCOMMUNICATIONTECHNOLOGY_OFFSET, 1, FALSE);
925
926                                 proto_tree_add_item(ptp_tree,
927                                     hf_ptp_mm_targetuuid, tvb, PTP_MM_TARGETUUID_OFFSET, 6, FALSE);
928
929                                 proto_tree_add_item(ptp_tree,
930                                     hf_ptp_mm_targetportid, tvb, PTP_MM_TARGETPORTID_OFFSET, 2, FALSE);
931
932                                 proto_tree_add_item(ptp_tree,
933                                     hf_ptp_mm_boundaryhops, tvb, PTP_MM_BOUNDARYHOPS_OFFSET, 2, FALSE);
934
935                                 proto_tree_add_item(ptp_tree,
936                                     hf_ptp_mm_managementmessagekey, tvb, PTP_MM_MANAGEMENTMESSAGEKEY_OFFSET, 1, FALSE);
937
938                                 proto_tree_add_item(ptp_tree,
939                                     hf_ptp_mm_parameterlength, tvb, PTP_MM_PARAMETERLENGTH_OFFSET, 2, FALSE);
940
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);
946
947                                                 proto_tree_add_item(ptp_tree, hf_ptp_mm_clock_identity_clockuuidfield, tvb,
948                                                                 PTP_MM_CLOCK_IDENTITY_CLOCKUUIDFIELD_OFFSET, 6, FALSE);
949
950                                                 proto_tree_add_item(ptp_tree, hf_ptp_mm_clock_identity_clockportfield, tvb,
951                                                                 PTP_MM_CLOCK_IDENTITY_CLOCKPORTFIELD_OFFSET, 2, FALSE);
952
953                                                 proto_tree_add_item(ptp_tree, hf_ptp_mm_clock_identity_manufactureridentity, tvb,
954                                                                 PTP_MM_CLOCK_IDENTITY_MANUFACTURERIDENTITY_OFFSET, 48, FALSE);
955                                                 break;
956                                         }
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);
960                                                 break;
961                                         }
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);
965                                                 break;
966                                         }
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,
970                                                                  1, FALSE);
971
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);
974
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);
977
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);
980
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);
983
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);
986
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);
989
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);
992
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);
995
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);
998
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);
1001
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);
1004
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);
1007
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);
1010
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);
1013                                                 break;
1014                                         }
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);
1018
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);
1021
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);
1024
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);
1027
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);
1030
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);
1033                                                 break;
1034                                         }
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);
1038
1039                                                 /* Subtree for offset from master*/
1040                                                 ts.secs = tvb_get_ntohl(tvb, PTP_MM_CURRENT_DATA_SET_OFFSETFROMMASTERSECONDS_OFFSET);
1041
1042                                                 ts.nsecs = tvb_get_ntohl(tvb,
1043                                                                 PTP_MM_CURRENT_DATA_SET_OFFSETFROMMASTERNANOSECONDS_OFFSET);
1044
1045                                                 if(tree){
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);
1049
1050                                                         ptp_time_tree = proto_item_add_subtree(time_ti, ett_ptp_time);
1051
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);
1055
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);
1059                                                 }
1060
1061                                                 /* Subtree for offset from master*/
1062                                                 ts.secs = tvb_get_ntohl(tvb, PTP_MM_CURRENT_DATA_SET_ONEWAYDELAYSECONDS_OFFSET);
1063
1064                                                 ts.nsecs = tvb_get_ntohl(tvb, PTP_MM_CURRENT_DATA_SET_ONEWAYDELAYNANOSECONDS_OFFSET);
1065
1066                                                 if(tree){
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);
1070
1071                                                         ptp_time2_tree = proto_item_add_subtree(time2_ti, ett_ptp_time2);
1072
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);
1075
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);
1079                                                 }
1080                                                 break;
1081                                         }
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,
1085                                                                 1, FALSE);
1086
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);
1089
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);
1092
1093                                                 proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_parentlastsyncsequencenumber,
1094                                                                 tvb, PTP_MM_PARENT_DATA_SET_PARENTLASTSYNCSEQUENCENUMBER_OFFSET,
1095                                                                 2, FALSE);
1096
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);
1099
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);
1102
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);
1105
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);
1108
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);
1111
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);
1114
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);
1117
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,
1121                                                                 FALSE);
1122
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);
1125
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);
1128
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);
1131
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);
1134
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);
1137
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);
1140
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);
1143
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);
1146                                                 break;
1147                                         }
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);
1151
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);
1154
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);
1157
1158                                                 proto_tree_add_item(ptp_tree, hf_ptp_mm_port_data_set_lastgeneraleventsequencenumber,
1159                                                                 tvb, PTP_MM_PORT_DATA_SET_LASTGENERALEVENTSEQUENCENUMBER_OFFSET,
1160                                                                 2, FALSE);
1161
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);
1164
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);
1167
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);
1170
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);
1173
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);
1176
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);
1179
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);
1182
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);
1185
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);
1188
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);
1191                                                 break;
1192                                         }
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);
1196
1197                                                 ts.nsecs = tvb_get_ntohl(tvb,
1198                                                                 PTP_MM_GLOBAL_TIME_DATA_SET_LOCALTIMENANOSECONDS_OFFSET);
1199
1200                                                 if(tree){
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);
1204
1205                                                         ptp_time_tree = proto_item_add_subtree(time_ti, ett_ptp_time);
1206
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);
1210
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);
1214                                                 }
1215
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);
1218
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);
1221
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);
1224
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);
1227                                                 break;
1228                                         }
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,
1232                                                                 2, FALSE);
1233
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);
1236
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);
1239
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);
1242                                                 break;
1243                                         }
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);
1247                                                 break;
1248                                         }
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);
1252
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);
1255
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,
1259                                                                 FALSE);
1260
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);
1263
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);
1266
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);
1269                                                 break;
1270                                         }
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);
1274                                                 break;
1275                                         }
1276                                         case PTP_MM_SET_TIME:{
1277                                                 /* Subtree for local time*/
1278                                                 ts.secs = tvb_get_ntohl(tvb, PTP_MM_SET_TIME_LOCALTIMESECONDS_OFFSET);
1279
1280                                                 ts.nsecs = tvb_get_ntohl(tvb, PTP_MM_SET_TIME_LOCALTIMENANOSECONDS_OFFSET);
1281
1282                                                 if(tree){
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);
1285
1286                                                         ptp_time_tree = proto_item_add_subtree(time_ti, ett_ptp_time);
1287
1288                                                         proto_tree_add_item(ptp_time_tree, hf_ptp_mm_set_time_localtimeseconds, tvb,
1289                                                                         PTP_MM_SET_TIME_LOCALTIMESECONDS_OFFSET, 4, FALSE);
1290
1291                                                         proto_tree_add_item(ptp_time_tree, hf_ptp_mm_set_time_localtimenanoseconds,
1292                                                                         tvb, PTP_MM_SET_TIME_LOCALTIMENANOSECONDS_OFFSET, 4, FALSE);
1293                                                 }
1294                                                 break;
1295                                         }
1296                                         default :{
1297                                                 /*- don't dissect any further. */
1298                                                 break;
1299                                         }
1300                                 }
1301                                 break;
1302                         }
1303                         default :{
1304                                 /* Not a valid MessageType - can't dissect. */
1305                                 break;
1306                         }
1307                 }
1308         }
1309 }
1310
1311
1312 /* Register the protocol with Ethereal */
1313
1314 void
1315 proto_register_ptp(void)
1316 {
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,
1322                         "", HFILL }
1323                 },
1324                 { &hf_ptp_versionnetwork,
1325                         { "versionNetwork",           "ptp.versionnetwork",
1326                         FT_UINT16, BASE_DEC, NULL, 0x00,
1327                         "", HFILL }
1328                 },
1329                 { &hf_ptp_subdomain,
1330                         { "subdomain",           "ptp.subdomain",
1331                         FT_STRING, BASE_DEC, NULL, 0x00,
1332                         "", HFILL }
1333                 },
1334                 { &hf_ptp_messagetype,
1335                         { "messageType",           "ptp.messagetype",
1336                         FT_UINT8, BASE_DEC, VALS(ptp_messagetype_vals), 0x00,
1337                         "", HFILL }
1338                 },
1339                 { &hf_ptp_sourcecommunicationtechnology,
1340                         { "sourceCommunicationTechnology",           "ptp.sourcecommunicationtechnology",
1341                         FT_UINT8, BASE_DEC, VALS(ptp_communicationid_vals), 0x00,
1342                         "", HFILL }
1343                 },
1344                 { &hf_ptp_sourceuuid,
1345                         { "sourceUuid",           "ptp.sourceuuid",
1346                         FT_ETHER, BASE_DEC, NULL, 0x00,
1347                         "", HFILL }
1348                 },
1349                 { &hf_ptp_sourceportid,
1350                         { "sourcePortId",           "ptp.sourceportid",
1351                         FT_UINT16, BASE_DEC, NULL, 0x00,
1352                         "", HFILL }
1353                 },
1354                 { &hf_ptp_sequenceid,
1355                         { "sequenceId",           "ptp.sequenceid",
1356                         FT_UINT16, BASE_DEC, NULL, 0x00,
1357                         "", HFILL }
1358                 },
1359                 { &hf_ptp_control,
1360                         { "control",           "ptp.control",
1361                         FT_UINT8, BASE_DEC, VALS(ptp_control_vals), 0x00,
1362                         "", HFILL }
1363                 },
1364                 /*THE FLAGS-FIELD*/
1365                 { &hf_ptp_flags,
1366                         { "flags",           "ptp.flags",
1367                         FT_UINT16, BASE_HEX, NULL, 0x00,
1368                         "", HFILL }
1369                 },
1370                 { &hf_ptp_flags_li61,
1371                         { "PTP_LI61",           "ptp.flags.li61",
1372                         FT_UINT16, BASE_DEC, VALS(ptp_bool_vals), PTP_FLAGS_LI61_BITMASK,
1373                         "", HFILL }
1374                 },
1375                 { &hf_ptp_flags_li59,
1376                         { "PTP_LI59",           "ptp.flags.li59",
1377                         FT_UINT16, BASE_DEC, VALS(ptp_bool_vals), PTP_FLAGS_LI59_BITMASK,
1378                         "", HFILL }
1379                 },
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,
1383                         "", HFILL }
1384                 },
1385                 { &hf_ptp_flags_assist,
1386                         { "PTP_ASSIST",           "ptp.flags.assist",
1387                         FT_UINT16, BASE_DEC, VALS(ptp_bool_vals), PTP_FLAGS_ASSIST_BITMASK,
1388                         "", HFILL }
1389                 },
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,
1393                         "", HFILL }
1394                 },
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,
1398                         "", HFILL }
1399                 },
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,
1403                         "", HFILL }
1404                 },
1405                 /*END OF THE FLAG-FIELD*/
1406
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,
1411                         "", HFILL }
1412                 },
1413                 { &hf_ptp_sdr_origintimestamp_seconds,
1414                         { "originTimestamp (seconds)",           "ptp.sdr.origintimestamp_seconds",
1415                         FT_UINT32, BASE_DEC, NULL, 0x00,
1416                         "", HFILL }
1417                 },
1418                 { &hf_ptp_sdr_origintimestamp_nanoseconds,
1419                         { "originTimestamp (nanoseconds)",           "ptp.sdr.origintimestamp_nanoseconds",
1420                         FT_INT32, BASE_DEC, NULL, 0x00,
1421                         "", HFILL }
1422                 },
1423                 { &hf_ptp_sdr_epochnumber,
1424                         { "epochNumber",           "ptp.sdr.epochnumber",
1425                         FT_UINT16, BASE_DEC, NULL, 0x00,
1426                         "", HFILL }
1427                 },
1428                 { &hf_ptp_sdr_currentutcoffset,
1429                         { "currentUTCOffset",           "ptp.sdr.currentutcoffset",
1430                         FT_INT16, BASE_DEC, NULL, 0x00,
1431                         "", HFILL }
1432                 },
1433                 { &hf_ptp_sdr_grandmastercommunicationtechnology,
1434                         { "grandmasterCommunicationTechnology",           "ptp.sdr.grandmastercommunicationtechnology",
1435                         FT_UINT8, BASE_DEC, VALS(ptp_communicationid_vals), 0x00,
1436                         "", HFILL }
1437                 },
1438                 { &hf_ptp_sdr_grandmasterclockuuid,
1439                         { "grandMasterClockUuid",           "ptp.sdr.grandmasterclockuuid",
1440                         FT_ETHER, BASE_DEC, NULL, 0x00,
1441                         "", HFILL }
1442                 },
1443                 { &hf_ptp_sdr_grandmasterportid,
1444                         { "grandmasterPortId",           "ptp.sdr.grandmasterportid",
1445                         FT_UINT16, BASE_DEC, NULL, 0x00,
1446                         "", HFILL }
1447                 },
1448                 { &hf_ptp_sdr_grandmastersequenceid,
1449                         { "grandmasterSequenceId",           "ptp.sdr.grandmastersequenceid",
1450                         FT_UINT16, BASE_DEC, NULL, 0x00,
1451                         "", HFILL }
1452                 },
1453                 { &hf_ptp_sdr_grandmasterclockstratum,
1454                         { "grandmasterClockStratum",           "ptp.sdr.grandmasterclockstratum",
1455                         FT_UINT8, BASE_DEC, NULL, 0x00,
1456                         "", HFILL }
1457                 },
1458                 { &hf_ptp_sdr_grandmasterclockidentifier,
1459                         { "grandmasterClockIdentifier",           "ptp.sdr.grandmasterclockidentifier",
1460                         FT_STRING, BASE_DEC, NULL, 0x00,
1461                         "", HFILL }
1462                 },
1463                 { &hf_ptp_sdr_grandmasterclockvariance,
1464                         { "grandmasterClockVariance",           "ptp.sdr.grandmasterclockvariance",
1465                         FT_INT16, BASE_DEC, NULL, 0x00,
1466                         "", HFILL }
1467                 },
1468                 { &hf_ptp_sdr_grandmasterpreferred,
1469                         { "grandmasterPreferred",           "ptp.sdr.grandmasterpreferred",
1470                         FT_UINT8, BASE_DEC, NULL, 0x00,
1471                         "", HFILL }
1472                 },
1473                 { &hf_ptp_sdr_grandmasterisboundaryclock,
1474                         { "grandmasterIsBoundaryClock",           "ptp.sdr.grandmasterisboundaryclock",
1475                         FT_UINT8, BASE_DEC, NULL, 0x00,
1476                         "", HFILL }
1477                 },
1478                 { &hf_ptp_sdr_syncinterval,
1479                         { "syncInterval",           "ptp.sdr.syncinterval",
1480                         FT_INT8, BASE_DEC, NULL, 0x00,
1481                         "", HFILL }
1482                 },
1483                 { &hf_ptp_sdr_localclockvariance,
1484                         { "localClockVariance",           "ptp.sdr.localclockvariance",
1485                         FT_INT16, BASE_DEC, NULL, 0x00,
1486                         "", HFILL }
1487                 },
1488                 { &hf_ptp_sdr_localstepsremoved,
1489                         { "localStepsRemoved",           "ptp.sdr.localstepsremoved",
1490                         FT_UINT16, BASE_DEC, NULL, 0x00,
1491                         "", HFILL }
1492                 },
1493                 { &hf_ptp_sdr_localclockstratum,
1494                         { "localClockStratum",           "ptp.sdr.localclockstratum",
1495                         FT_UINT8, BASE_DEC, NULL, 0x00,
1496                         "", HFILL }
1497                 },
1498                 { &hf_ptp_sdr_localclockidentifier,
1499                         { "localClockIdentifier",           "ptp.sdr.localclockidentifier",
1500                         FT_STRING, BASE_DEC, NULL, 0x00,
1501                         "", HFILL }
1502                 },
1503                 { &hf_ptp_sdr_parentcommunicationtechnology,
1504                         { "parentCommunicationTechnology",           "ptp.sdr.parentcommunicationtechnology",
1505                         FT_UINT8, BASE_DEC, VALS(ptp_communicationid_vals), 0x00,
1506                         "", HFILL }
1507                 },
1508                 { &hf_ptp_sdr_parentuuid,
1509                         { "parentUuid",           "ptp.sdr.parentuuid",
1510                         FT_ETHER, BASE_DEC, NULL, 0x00,
1511                         "", HFILL }
1512                 },
1513                 { &hf_ptp_sdr_parentportfield,
1514                         { "parentPortField",           "ptp.sdr.parentportfield",
1515                         FT_UINT16, BASE_DEC, NULL, 0x00,
1516                         "", HFILL }
1517                 },
1518                 { &hf_ptp_sdr_estimatedmastervariance,
1519                         { "estimatedMasterVariance",           "ptp.sdr.estimatedmastervariance",
1520                         FT_INT16, BASE_DEC, NULL, 0x00,
1521                         "", HFILL }
1522                 },
1523                 { &hf_ptp_sdr_estimatedmasterdrift,
1524                         { "estimatedMasterDrift",           "ptp.sdr.estimatedmasterdrift",
1525                         FT_INT32, BASE_DEC, NULL, 0x00,
1526                         "", HFILL }
1527                 },
1528                 { &hf_ptp_sdr_utcreasonable,
1529                         { "utcReasonable",           "ptp.sdr.utcreasonable",
1530                         FT_BOOLEAN, BASE_DEC, NULL, 0x00,
1531                         "", HFILL }
1532                 },
1533                 /*offsets for follow_up (=fu) messages*/
1534                 { &hf_ptp_fu_associatedsequenceid,
1535                         { "associatedSequenceId",           "ptp.fu.associatedsequenceid",
1536                         FT_UINT16, BASE_DEC, NULL, 0x00,
1537                         "", HFILL }
1538                 },
1539                 { &hf_ptp_fu_preciseorigintimestamp,
1540                         { "preciseOriginTimestamp",     "ptp.fu.hf_ptp_fu_preciseorigintimestamp",
1541                         FT_RELATIVE_TIME, BASE_NONE, NULL, 0x00,
1542                         "", HFILL }
1543                 },
1544                 { &hf_ptp_fu_preciseorigintimestamp_seconds,
1545                         { "preciseOriginTimestamp (seconds)",   "ptp.fu.hf_ptp_fu_preciseorigintimestamp_seconds",
1546                         FT_UINT32, BASE_DEC, NULL, 0x00,
1547                         "", HFILL }
1548                 },
1549                 { &hf_ptp_fu_preciseorigintimestamp_nanoseconds,
1550                         { "preciseOriginTimestamp (nanoseconds)",           "ptp.fu.preciseorigintimestamp_nanoseconds",
1551                         FT_INT32, BASE_DEC, NULL, 0x00,
1552                         "", HFILL }
1553                 },
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,
1558                         "", HFILL }
1559                 },
1560                 { &hf_ptp_dr_delayreceipttimestamp_seconds,
1561                         { "delayReceiptTimestamp (Seconds)",           "ptp.dr.delayreceipttimestamp_seconds",
1562                         FT_UINT32, BASE_DEC, NULL, 0x00,
1563                         "", HFILL }
1564                 },
1565                 { &hf_ptp_dr_delayreceipttimestamp_nanoseconds,
1566                         { "delayReceiptTimestamp (nanoseconds)",           "ptp.dr.delayreceipttimestamp_nanoseconds",
1567                         FT_INT32, BASE_DEC, NULL, 0x00,
1568                         "", HFILL }
1569                 },
1570                 { &hf_ptp_dr_requestingsourcecommunicationtechnology,
1571                         { "requestingSourceCommunicationTechnology",    "ptp.dr.requestingsourcecommunicationtechnology",
1572                         FT_UINT8, BASE_DEC, VALS(ptp_communicationid_vals), 0x00,
1573                         "", HFILL }
1574                 },
1575                 { &hf_ptp_dr_requestingsourceuuid,
1576                         { "requestingSourceUuid",           "ptp.dr.requestingsourceuuid",
1577                         FT_ETHER, BASE_DEC, NULL, 0x00,
1578                         "", HFILL }
1579                 },
1580                 { &hf_ptp_dr_requestingsourceportid,
1581                         { "requestingSourcePortId",           "ptp.dr.requestingsourceportid",
1582                         FT_UINT16, BASE_DEC, NULL, 0x00,
1583                         "", HFILL }
1584                 },
1585                 { &hf_ptp_dr_requestingsourcesequenceid,
1586                         { "requestingSourceSequenceId",           "ptp.dr.requestingsourcesequenceid",
1587                         FT_UINT16, BASE_DEC, NULL, 0x00,
1588                         "", HFILL }
1589                 },
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,
1594                         "", HFILL }
1595                 },
1596                 { &hf_ptp_mm_targetuuid,
1597                         { "targetUuid",           "ptp.mm.targetuuid",
1598                         FT_ETHER, BASE_DEC, NULL, 0x00,
1599                         "", HFILL }
1600                 },
1601                 { &hf_ptp_mm_targetportid,
1602                         { "targetPortId",           "ptp.mm.targetportid",
1603                         FT_UINT16, BASE_DEC, NULL, 0x00,
1604                         "", HFILL }
1605                 },
1606                 { &hf_ptp_mm_boundaryhops,
1607                         { "boundaryHops",           "ptp.mm.boundaryhops",
1608                         FT_INT16, BASE_DEC, NULL, 0x00,
1609                         "", HFILL }
1610                 },
1611                 { &hf_ptp_mm_managementmessagekey,
1612                         { "managementMessageKey",           "ptp.mm.managementmessagekey",
1613                         FT_UINT8, BASE_DEC, VALS(ptp_managementMessageKey_vals), 0x00,
1614                         "", HFILL }
1615                 },
1616                 { &hf_ptp_mm_parameterlength,
1617                         { "parameterLength",           "ptp.mm.parameterlength",
1618                         FT_UINT16, BASE_DEC, NULL, 0x00,
1619                         "", HFILL }
1620                 },
1621                 /*parameterlength > 0*/
1622                 { &hf_ptp_mm_messageparameters,
1623                         { "messageParameters",           "ptp.mm.messageparameters",
1624                         FT_BYTES, BASE_DEC, NULL, 0x00,
1625                         "", HFILL }
1626                 },
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,
1631                         "", HFILL }
1632                 },
1633                 { &hf_ptp_mm_clock_identity_clockuuidfield,
1634                         { "clockUuidField",           "ptp.mm.clock.identity.clockuuidfield",
1635                         FT_ETHER, BASE_DEC, NULL, 0x00,
1636                         "", HFILL }
1637                 },
1638                 { &hf_ptp_mm_clock_identity_clockportfield,
1639                         { "clockPortField",           "ptp.mm.clock.identity.clockportfield",
1640                         FT_UINT16, BASE_DEC, NULL, 0x00,
1641                         "", HFILL }
1642                 },
1643                 { &hf_ptp_mm_clock_identity_manufactureridentity,
1644                         { "manufacturerIdentity",           "ptp.mm.clock.identity.manufactureridentity",
1645                         FT_BYTES, BASE_DEC, NULL, 0x00,
1646                         "", HFILL }
1647                 },
1648
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,
1653                         "", HFILL }
1654                 },
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,
1659                         "", HFILL }
1660                 },
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,
1665                         "", HFILL }
1666                 },
1667                 { &hf_ptp_mm_default_data_set_clockuuidfield,
1668                         { "clockUuidField",           "ptp.mm.default.data.set.clockuuidfield",
1669                         FT_ETHER, BASE_DEC, NULL, 0x00,
1670                         "", HFILL }
1671                 },
1672                 { &hf_ptp_mm_default_data_set_clockportfield,
1673                         { "clockPortField",           "ptp.mm.default.data.set.clockportfield",
1674                         FT_UINT16, BASE_DEC, NULL, 0x00,
1675                         "", HFILL }
1676                 },
1677                 { &hf_ptp_mm_default_data_set_clockstratum,
1678                         { "clockStratum",           "ptp.mm.default.data.set.clockstratum",
1679                         FT_UINT8, BASE_DEC, NULL, 0x00,
1680                         "", HFILL }
1681                 },
1682                 { &hf_ptp_mm_default_data_set_clockidentifier,
1683                         { "clockIdentifier",           "ptp.mm.default.data.set.clockidentifier",
1684                         FT_BYTES, BASE_DEC, NULL, 0x00,
1685                         "", HFILL }
1686                 },
1687                 { &hf_ptp_mm_default_data_set_clockvariance,
1688                         { "clockVariance",           "ptp.mm.default.data.set.clockvariance",
1689                         FT_UINT16, BASE_DEC, NULL, 0x00,
1690                         "", HFILL }
1691                 },
1692                 { &hf_ptp_mm_default_data_set_clockfollowupcapable,
1693                         { "clockFollowupCapable",           "ptp.mm.default.data.set.clockfollowupcapable",
1694                         FT_BOOLEAN, BASE_DEC, NULL, 0x00,
1695                         "", HFILL }
1696                 },
1697                 { &hf_ptp_mm_default_data_set_preferred,
1698                         { "preferred",           "ptp.mm.default.data.set.preferred",
1699                         FT_BOOLEAN, BASE_DEC, NULL, 0x00,
1700                         "", HFILL }
1701                 },
1702                 { &hf_ptp_mm_default_data_set_initializable,
1703                         { "initializable",           "ptp.mm.default.data.set.initializable",
1704                         FT_BOOLEAN, BASE_DEC, NULL, 0x00,
1705                         "", HFILL }
1706                 },
1707                 { &hf_ptp_mm_default_data_set_externaltiming,
1708                         { "externalTiming",           "ptp.mm.default.data.set.externaltiming",
1709                         FT_BOOLEAN, BASE_DEC, NULL, 0x00,
1710                         "", HFILL }
1711                 },
1712                 { &hf_ptp_mm_default_data_set_isboundaryclock,
1713                         { "isBoundaryClock",           "ptp.mm.default.data.set.isboundaryclock",
1714                         FT_BOOLEAN, BASE_DEC, NULL, 0x00,
1715                         "", HFILL }
1716                 },
1717                 { &hf_ptp_mm_default_data_set_syncinterval,
1718                         { "syncInterval",           "ptp.mm.default.data.set.syncinterval",
1719                         FT_INT8, BASE_DEC, NULL, 0x00,
1720                         "", HFILL }
1721                 },
1722                 { &hf_ptp_mm_default_data_set_subdomainname,
1723                         { "subDomainName",           "ptp.mm.default.data.set.subdomainname",
1724                         FT_STRING, BASE_DEC, NULL, 0x00,
1725                         "", HFILL }
1726                 },
1727                 { &hf_ptp_mm_default_data_set_numberports,
1728                         { "numberPorts",           "ptp.mm.default.data.set.numberports",
1729                         FT_UINT16, BASE_DEC, NULL, 0x00,
1730                         "", HFILL }
1731                 },
1732                 { &hf_ptp_mm_default_data_set_numberforeignrecords,
1733                         { "numberForeignRecords",           "ptp.mm.default.data.set.numberforeignrecords",
1734                         FT_UINT16, BASE_DEC, NULL, 0x00,
1735                         "", HFILL }
1736                 },
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,
1741                         "", HFILL }
1742                 },
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,
1746                         "", HFILL }
1747                 },
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,
1751                         "", HFILL }
1752                 },
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,
1756                         "", HFILL }
1757                 },
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,
1761                         "", HFILL }
1762                 },
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,
1766                         "", HFILL }
1767                 },
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,
1772                         "", HFILL }
1773                 },
1774                 { &hf_ptp_mm_current_data_set_offsetfrommaster,
1775                         { "offsetFromMaster",           "ptp.mm.current.data.set.offsetfrommaster",
1776                         FT_RELATIVE_TIME, BASE_NONE, NULL, 0x00,
1777                         "", HFILL }
1778                 },
1779                 { &hf_ptp_mm_current_data_set_offsetfrommasterseconds,
1780                         { "offsetFromMasterSeconds",           "ptp.mm.current.data.set.offsetfrommasterseconds",
1781                         FT_UINT32, BASE_DEC, NULL, 0x00,
1782                         "", HFILL }
1783                 },
1784                 { &hf_ptp_mm_current_data_set_offsetfrommasternanoseconds,
1785                         { "offsetFromMasterNanoseconds",           "ptp.mm.current.data.set.offsetfrommasternanoseconds",
1786                         FT_INT32, BASE_DEC, NULL, 0x00,
1787                         "", HFILL }
1788                 },
1789                 { &hf_ptp_mm_current_data_set_onewaydelay,
1790                         { "oneWayDelay",           "ptp.mm.current.data.set.onewaydelay",
1791                         FT_RELATIVE_TIME, BASE_NONE, NULL, 0x00,
1792                         "", HFILL }
1793                 },
1794                 { &hf_ptp_mm_current_data_set_onewaydelayseconds,
1795                         { "oneWayDelaySeconds",           "ptp.mm.current.data.set.onewaydelayseconds",
1796                         FT_UINT32, BASE_DEC, NULL, 0x00,
1797                         "", HFILL }
1798                 },
1799                 { &hf_ptp_mm_current_data_set_onewaydelaynanoseconds,
1800                         { "oneWayDelayNanoseconds",           "ptp.mm.current.data.set.onewaydelaynanoseconds",
1801                         FT_INT32, BASE_DEC, NULL, 0x00,
1802                         "", HFILL }
1803                 },
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,
1808                         "", HFILL }
1809                 },
1810                 { &hf_ptp_mm_parent_data_set_parentuuid,
1811                         { "parentUuid",           "ptp.mm.parent.data.set.parentuuid",
1812                         FT_ETHER, BASE_DEC, NULL, 0x00,
1813                         "", HFILL }
1814                 },
1815                 { &hf_ptp_mm_parent_data_set_parentportid,
1816                         { "parentPortId",           "ptp.mm.parent.data.set.parentportid",
1817                         FT_UINT16, BASE_DEC, NULL, 0x00,
1818                         "", HFILL }
1819                 },
1820                 { &hf_ptp_mm_parent_data_set_parentlastsyncsequencenumber,
1821                         { "parentLastSyncSequenceNumber",           "ptp.mm.parent.data.set.parentlastsyncsequencenumber",
1822                         FT_UINT16, BASE_DEC, NULL, 0x00,
1823                         "", HFILL }
1824                 },
1825                 { &hf_ptp_mm_parent_data_set_parentfollowupcapable,
1826                         { "parentFollowupCapable",           "ptp.mm.parent.data.set.parentfollowupcapable",
1827                         FT_BOOLEAN, BASE_DEC, NULL, 0x00,
1828                         "", HFILL }
1829                 },
1830                 { &hf_ptp_mm_parent_data_set_parentexternaltiming,
1831                         { "parentExternalTiming",           "ptp.mm.parent.data.set.parentexternaltiming",
1832                         FT_BOOLEAN, BASE_DEC, NULL, 0x00,
1833                         "", HFILL }
1834                 },
1835                 { &hf_ptp_mm_parent_data_set_parentvariance,
1836                         { "parentVariance",           "ptp.mm.parent.data.set.parentvariance",
1837                         FT_UINT16, BASE_DEC, NULL, 0x00,
1838                         "", HFILL }
1839                 },
1840                 { &hf_ptp_mm_parent_data_set_parentstats,
1841                         { "parentStats",           "ptp.mm.parent.data.set.parentstats",
1842                         FT_BOOLEAN, BASE_DEC, NULL, 0x00,
1843                         "", HFILL }
1844                 },
1845                 { &hf_ptp_mm_parent_data_set_observedvariance,
1846                         { "observedVariance",           "ptp.mm.parent.data.set.observedvariance",
1847                         FT_INT16, BASE_DEC, NULL, 0x00,
1848                         "", HFILL }
1849                 },
1850                 { &hf_ptp_mm_parent_data_set_observeddrift,
1851                         { "observedDrift",           "ptp.mm.parent.data.set.observeddrift",
1852                         FT_INT32, BASE_DEC, NULL, 0x00,
1853                         "", HFILL }
1854                 },
1855                 { &hf_ptp_mm_parent_data_set_utcreasonable,
1856                         { "utcReasonable",           "ptp.mm.parent.data.set.utcreasonable",
1857                         FT_BOOLEAN, BASE_DEC, NULL, 0x00,
1858                         "", HFILL }
1859                 },
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,
1863                         "", HFILL }
1864                 },
1865                 { &hf_ptp_mm_parent_data_set_grandmasteruuidfield,
1866                         { "grandmasterUuidField",           "ptp.mm.parent.data.set.grandmasteruuidfield",
1867                         FT_ETHER, BASE_DEC, NULL, 0x00,
1868                         "", HFILL }
1869                 },
1870                 { &hf_ptp_mm_parent_data_set_grandmasterportidfield,
1871                         { "grandmasterPortIdField",           "ptp.mm.parent.data.set.grandmasterportidfield",
1872                         FT_UINT16, BASE_DEC, NULL, 0x00,
1873                         "", HFILL }
1874                 },
1875                 { &hf_ptp_mm_parent_data_set_grandmasterstratum,
1876                         { "grandmasterStratum",           "ptp.mm.parent.data.set.grandmasterstratum",
1877                         FT_UINT8, BASE_DEC, NULL, 0x00,
1878                         "", HFILL }
1879                 },
1880                 { &hf_ptp_mm_parent_data_set_grandmasteridentifier,
1881                         { "grandmasterIdentifier",           "ptp.mm.parent.data.set.grandmasteridentifier",
1882                         FT_BYTES, BASE_DEC, NULL, 0x00,
1883                         "", HFILL }
1884                 },
1885                 { &hf_ptp_mm_parent_data_set_grandmastervariance,
1886                         { "grandmasterVariance",           "ptp.mm.parent.data.set.grandmastervariance",
1887                         FT_INT16, BASE_DEC, NULL, 0x00,
1888                         "", HFILL }
1889                 },
1890                 { &hf_ptp_mm_parent_data_set_grandmasterpreferred,
1891                         { "grandmasterPreferred",           "ptp.mm.parent.data.set.grandmasterpreferred",
1892                         FT_BOOLEAN, BASE_DEC, NULL, 0x00,
1893                         "", HFILL }
1894                 },
1895                 { &hf_ptp_mm_parent_data_set_grandmasterisboundaryclock,
1896                         { "grandmasterIsBoundaryClock",           "ptp.mm.parent.data.set.grandmasterisboundaryclock",
1897                         FT_BOOLEAN, BASE_DEC, NULL, 0x00,
1898                         "", HFILL }
1899                 },
1900                 { &hf_ptp_mm_parent_data_set_grandmastersequencenumber,
1901                         { "grandmasterSequenceNumber",           "ptp.mm.parent.data.set.grandmastersequencenumber",
1902                         FT_UINT16, BASE_DEC, NULL, 0x00,
1903                         "", HFILL }
1904                 },
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,
1909                         "", HFILL }
1910                 },
1911                 { &hf_ptp_mm_port_data_set_portstate,
1912                         { "portState",           "ptp.mm.port.data.set.portstate",
1913                         FT_UINT8, BASE_DEC, NULL, 0x00,
1914                         "", HFILL }
1915                 },
1916                 { &hf_ptp_mm_port_data_set_lastsynceventsequencenumber,
1917                         { "lastSyncEventSequenceNumber",           "ptp.mm.port.data.set.lastsynceventsequencenumber",
1918                         FT_UINT16, BASE_DEC, NULL, 0x00,
1919                         "", HFILL }
1920                 },
1921                 { &hf_ptp_mm_port_data_set_lastgeneraleventsequencenumber,
1922                         { "lastGeneralEventSequenceNumber",           "ptp.mm.port.data.set.lastgeneraleventsequencenumber",
1923                         FT_UINT16, BASE_DEC, NULL, 0x00,
1924                         "", HFILL }
1925                 },
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,
1929                         "", HFILL }
1930                 },
1931                 { &hf_ptp_mm_port_data_set_portuuidfield,
1932                         { "portUuidField",           "ptp.mm.port.data.set.portuuidfield",
1933                         FT_ETHER, BASE_DEC, NULL, 0x00,
1934                         "", HFILL }
1935                 },
1936                 { &hf_ptp_mm_port_data_set_portidfield,
1937                         { "portIdField",           "ptp.mm.port.data.set.portidfield",
1938                         FT_UINT16, BASE_DEC, NULL, 0x00,
1939                         "", HFILL }
1940                 },
1941                 { &hf_ptp_mm_port_data_set_burstenabled,
1942                         { "burstEnabled",           "ptp.mm.port.data.set.burstenabled",
1943                         FT_BOOLEAN, BASE_DEC, NULL, 0x00,
1944                         "", HFILL }
1945                 },
1946                 { &hf_ptp_mm_port_data_set_subdomainaddressoctets,
1947                         { "subdomainAddressOctets",           "ptp.mm.port.data.set.subdomainaddressoctets",
1948                         FT_UINT8, BASE_DEC, NULL, 0x00,
1949                         "", HFILL }
1950                 },
1951                 { &hf_ptp_mm_port_data_set_eventportaddressoctets,
1952                         { "eventPortAddressOctets",           "ptp.mm.port.data.set.eventportaddressoctets",
1953                         FT_UINT8, BASE_DEC, NULL, 0x00,
1954                         "", HFILL }
1955                 },
1956                 { &hf_ptp_mm_port_data_set_generalportaddressoctets,
1957                         { "generalPortAddressOctets",           "ptp.mm.port.data.set.generalportaddressoctets",
1958                         FT_UINT8, BASE_DEC, NULL, 0x00,
1959                         "", HFILL }
1960                 },
1961                 { &hf_ptp_mm_port_data_set_subdomainaddress,
1962                         { "subdomainAddress",           "ptp.mm.port.data.set.subdomainaddress",
1963                         FT_BYTES, BASE_DEC, NULL, 0x00,
1964                         "", HFILL }
1965                 },
1966                 { &hf_ptp_mm_port_data_set_eventportaddress,
1967                         { "eventPortAddress",           "ptp.mm.port.data.set.eventportaddress",
1968                         FT_BYTES, BASE_DEC, NULL, 0x00,
1969                         "", HFILL }
1970                 },
1971                 { &hf_ptp_mm_port_data_set_generalportaddress,
1972                         { "generalPortAddress",           "ptp.mm.port.data.set.generalportaddress",
1973                         FT_BYTES, BASE_DEC, NULL, 0x00,
1974                         "", HFILL }
1975                 },
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,
1980                         "", HFILL }
1981                 },
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,
1985                         "", HFILL }
1986                 },
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,
1990                         "", HFILL }
1991                 },
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,
1995                         "", HFILL }
1996                 },
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,
2000                         "", HFILL }
2001                 },
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,
2005                         "", HFILL }
2006                 },
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,
2010                         "", HFILL }
2011                 },
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,
2016                         "", HFILL }
2017                 },
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,
2021                         "", HFILL }
2022                 },
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,
2026                         "", HFILL }
2027                 },
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,
2031                         "", HFILL }
2032                 },
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,
2037                         "", HFILL }
2038                 },
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,
2043                         "", HFILL }
2044                 },
2045                 { &hf_ptp_mm_foreign_data_set_returnedrecordnumber,
2046                         { "returnedRecordNumber",           "ptp.mm.foreign.data.set.returnedrecordnumber",
2047                         FT_UINT16, BASE_DEC, NULL, 0x00,
2048                         "", HFILL }
2049                 },
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,
2054                         "", HFILL }
2055                 },
2056                 { &hf_ptp_mm_foreign_data_set_foreignmasteruuidfield,
2057                         { "foreignMasterUuidField",           "ptp.mm.foreign.data.set.foreignmasteruuidfield",
2058                         FT_ETHER, BASE_DEC, NULL, 0x00,
2059                         "", HFILL }
2060                 },
2061                 { &hf_ptp_mm_foreign_data_set_foreignmasterportidfield,
2062                         { "foreignMasterPortIdField",           "ptp.mm.foreign.data.set.foreignmasterportidfield",
2063                         FT_UINT16, BASE_DEC, NULL, 0x00,
2064                         "", HFILL }
2065                 },
2066                 { &hf_ptp_mm_foreign_data_set_foreignmastersyncs,
2067                         { "foreignMasterSyncs",           "ptp.mm.foreign.data.set.foreignmastersyncs",
2068                         FT_UINT16, BASE_DEC, NULL, 0x00,
2069                         "", HFILL }
2070                 },
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,
2075                         "", HFILL }
2076                 },
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,
2081                         "", HFILL }
2082                 },
2083                 { &hf_ptp_mm_set_time_localtimeseconds,
2084                         { "localtimeSeconds",           "ptp.mm.set.time.localtimeseconds",
2085                         FT_UINT32, BASE_DEC, NULL, 0x00,
2086                         "", HFILL }
2087                 },
2088                 { &hf_ptp_mm_set_time_localtimenanoseconds,
2089                         { "localTimeNanoseconds",           "ptp.mm.set.time.localtimenanoseconds",
2090                         FT_INT32, BASE_DEC, NULL, 0x0,
2091                         "", HFILL }
2092                 },
2093         };
2094
2095 /* Setup protocol subtree array */
2096         static gint *ett[] = {
2097                 &ett_ptp,
2098                 &ett_ptp_flags,
2099                 &ett_ptp_time,
2100                 &ett_ptp_time2,
2101         };
2102
2103 /* Register the protocol name and description */
2104         proto_ptp = proto_register_protocol("Precision Time Protocol (IEEE1588)",
2105             "PTP", "ptp");
2106
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));
2110 }
2111
2112 void
2113 proto_reg_handoff_ptp(void)
2114 {
2115         dissector_handle_t event_port_ptp_handle;
2116     dissector_handle_t general_port_ptp_handle;
2117
2118         event_port_ptp_handle = create_dissector_handle(dissect_ptp,
2119             proto_ptp);
2120         general_port_ptp_handle = create_dissector_handle(dissect_ptp,
2121             proto_ptp);
2122
2123         dissector_add("udp.port", EVENT_PORT_PTP, event_port_ptp_handle);
2124         dissector_add("udp.port", GENERAL_PORT_PTP, general_port_ptp_handle);
2125 }
2126