wireshark/epan/dissectors/packet-ptp.c
Michael Mann 2eb7b05b8c Convert most UDP dissectors to use "auto" preferences.
Similar to the "tcp.port" changes in I99604f95d426ad345f4b494598d94178b886eb67,
convert dissectors that use "udp.port".

More cleanup done on dissectors that use both TCP and UDP dissector
tables, so that less preference callbacks exist.

Change-Id: If07be9b9e850c244336a7069599cd554ce312dd3
Reviewed-on: https://code.wireshark.org/review/18120
Petri-Dish: Michael Mann <mmann78@netscape.net>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Michael Mann <mmann78@netscape.net>
2016-10-13 02:51:18 +00:00

6276 lines
301 KiB
C

/* packet-ptp.c
* Routines for PTP (Precision Time Protocol) dissection
* Copyright 2004, Auges Tchouante <tchouante2001@yahoo.fr>
* Copyright 2004, Dominic Bechaz <bdo@zhwin.ch> , ZHW/InES
* Copyright 2004, Markus Seehofer <mseehofe@nt.hirschmann.de>
* Copyright 2006, Christian Schaer <scc@zhwin.ch>
* Copyright 2007, Markus Renz <Markus.Renz@hirschmann.de>
* Copyright 2010, Torrey Atcitty <torrey.atcitty@harman.com>
* Dave Olsen <dave.olsen@harman.com>
* Copyright 2013, Andreas Bachmann <bacr@zhaw.ch>, ZHAW/InES
* Copyright 2016, Uli Heilmeier <uh@heilmeier.eu>
*
* Revisions:
* - Markus Seehofer 09.08.2005 <mseehofe@nt.hirschmann.de>
* - Included the "startingBoundaryHops" field in
* ptp_management messages.
* - Christian Schaer 07.07.2006 <scc@zhwin.ch>
* - Added support for PTP version 2
* - Markus Renz 2007-06-01
* - updated support for PTPv2
* - Markus Renz added Management for PTPv2, update to Draft 2.2
* - Torrey Atcitty & Dave Olsen 05.14.2010
* - Added support for 802.1AS D7.0
* - Andreas Bachmann 08.07.2013 <bacr@zhaw.ch>
* - allow multiple TLVs
* - bugfix in logInterMessagePeriod guint8 -> gint8
* - Uli Heilmeier 21.03.2016 <uh@heilmeier.eu>
* - Added support for SMPTE TLV
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "config.h"
#include <math.h>
#include <epan/packet.h>
#include <epan/etypes.h>
#include <epan/expert.h>
#include <epan/exceptions.h>
#include "packet-ptp.h"
/**********************************************************/
/* Port definition's for PTP */
/**********************************************************/
#define PTP_PORT_RANGE "319-320"
/* END Port definition's for PTP */
void proto_register_ptp(void);
void proto_reg_handoff_ptp(void);
static int proto_ptp = -1;
/***********************************************************************************/
/* Definitions and fields for PTPv1 dissection. */
/***********************************************************************************/
/**********************************************************/
/* Offsets of fields within a PTPv1 packet. */
/**********************************************************/
/* Common offsets for all Messages (Synch, Delay_Req, Follow_Up, Delay_Resp ....) */
#define PTP_VERSIONPTP_OFFSET 0
#define PTP_VERSIONNETWORK_OFFSET 2
#define PTP_SUBDOMAIN_OFFSET 4
#define PTP_MESSAGETYPE_OFFSET 20
#define PTP_SOURCECOMMUNICATIONTECHNOLOGY_OFFSET 21
#define PTP_SOURCEUUID_OFFSET 22
#define PTP_SOURCEPORTID_OFFSET 28
#define PTP_SEQUENCEID_OFFSET 30
#define PTP_CONTROL_OFFSET 32
#define PTP_FLAGS_OFFSET 34
#define PTP_FLAGS_LI61_OFFSET 34
#define PTP_FLAGS_LI59_OFFSET 34
#define PTP_FLAGS_BOUNDARY_CLOCK_OFFSET 34
#define PTP_FLAGS_ASSIST_OFFSET 34
#define PTP_FLAGS_EXT_SYNC_OFFSET 34
#define PTP_FLAGS_PARENT_STATS_OFFSET 34
#define PTP_FLAGS_SYNC_BURST_OFFSET 34
/* Offsets for PTP_Sync and Delay_Req (=SDR) messages */
#define PTP_SDR_ORIGINTIMESTAMP_OFFSET 40
#define PTP_SDR_ORIGINTIMESTAMP_SECONDS_OFFSET 40
#define PTP_SDR_ORIGINTIMESTAMP_NANOSECONDS_OFFSET 44
#define PTP_SDR_EPOCHNUMBER_OFFSET 48
#define PTP_SDR_CURRENTUTCOFFSET_OFFSET 50
#define PTP_SDR_GRANDMASTERCOMMUNICATIONTECHNOLOGY_OFFSET 53
#define PTP_SDR_GRANDMASTERCLOCKUUID_OFFSET 54
#define PTP_SDR_GRANDMASTERPORTID_OFFSET 60
#define PTP_SDR_GRANDMASTERSEQUENCEID_OFFSET 62
#define PTP_SDR_GRANDMASTERCLOCKSTRATUM_OFFSET 67
#define PTP_SDR_GRANDMASTERCLOCKIDENTIFIER_OFFSET 68
#define PTP_SDR_GRANDMASTERCLOCKVARIANCE_OFFSET 74
#define PTP_SDR_GRANDMASTERPREFERRED_OFFSET 77
#define PTP_SDR_GRANDMASTERISBOUNDARYCLOCK_OFFSET 79
#define PTP_SDR_SYNCINTERVAL_OFFSET 83
#define PTP_SDR_LOCALCLOCKVARIANCE_OFFSET 86
#define PTP_SDR_LOCALSTEPSREMOVED_OFFSET 90
#define PTP_SDR_LOCALCLOCKSTRATUM_OFFSET 95
#define PTP_SDR_LOCALCLOCKIDENTIFIER_OFFSET 96
#define PTP_SDR_PARENTCOMMUNICATIONTECHNOLOGY_OFFSET 101
#define PTP_SDR_PARENTUUID_OFFSET 102
#define PTP_SDR_PARENTPORTFIELD_OFFSET 110
#define PTP_SDR_ESTIMATEDMASTERVARIANCE_OFFSET 114
#define PTP_SDR_ESTIMATEDMASTERDRIFT_OFFSET 116
#define PTP_SDR_UTCREASONABLE_OFFSET 123
/* Offsets for Follow_Up (=FU) messages */
#define PTP_FU_ASSOCIATEDSEQUENCEID_OFFSET 42
#define PTP_FU_PRECISEORIGINTIMESTAMP_OFFSET 44
#define PTP_FU_PRECISEORIGINTIMESTAMP_SECONDS_OFFSET 44
#define PTP_FU_PRECISEORIGINTIMESTAMP_NANOSECONDS_OFFSET 48
/* Offsets for Delay_Resp (=DR) messages */
#define PTP_DR_DELAYRECEIPTTIMESTAMP_OFFSET 40
#define PTP_DR_DELAYRECEIPTTIMESTAMP_SECONDS_OFFSET 40
#define PTP_DR_DELAYRECEIPTTIMESTAMP_NANOSECONDS_OFFSET 44
#define PTP_DR_REQUESTINGSOURCECOMMUNICATIONTECHNOLOGY_OFFSET 49
#define PTP_DR_REQUESTINGSOURCEUUID_OFFSET 50
#define PTP_DR_REQUESTINGSOURCEPORTID_OFFSET 56
#define PTP_DR_REQUESTINGSOURCESEQUENCEID_OFFSET 58
/* Offsets for Management (=MM) messages */
#define PTP_MM_TARGETCOMMUNICATIONTECHNOLOGY_OFFSET 41
#define PTP_MM_TARGETUUID_OFFSET 42
#define PTP_MM_TARGETPORTID_OFFSET 48
#define PTP_MM_STARTINGBOUNDARYHOPS_OFFSET 50
#define PTP_MM_BOUNDARYHOPS_OFFSET 52
#define PTP_MM_MANAGEMENTMESSAGEKEY_OFFSET 55
#define PTP_MM_PARAMETERLENGTH_OFFSET 58
/* PARAMETERLENGTH > 0 */
#define PTP_MM_MESSAGEPARAMETERS_OFFSET 60
/* PTP_MM_CLOCK_IDENTITY (PARAMETERLENGTH = 64) */
#define PTP_MM_CLOCK_IDENTITY_CLOCKCOMMUNICATIONTECHNOLOGY_OFFSET 63
#define PTP_MM_CLOCK_IDENTITY_CLOCKUUIDFIELD_OFFSET 64
#define PTP_MM_CLOCK_IDENTITY_CLOCKPORTFIELD_OFFSET 74
#define PTP_MM_CLOCK_IDENTITY_MANUFACTURERIDENTITY_OFFSET 76
/* PTP_MM_INITIALIZE_CLOCK (PARAMETERLENGTH = 4) */
#define PTP_MM_INITIALIZE_CLOCK_INITIALISATIONKEY_OFFSET 62
/* PTP_MM_SET_SUBDOMAIN (PARAMETERLENGTH = 16) */
#define PTP_MM_SET_SUBDOMAIN_SUBDOMAINNAME_OFFSET 60
/* PTP_MM_DEFAULT_DATA_SET (PARAMETERLENGTH = 76) */
#define PTP_MM_DEFAULT_DATA_SET_CLOCKCOMMUNICATIONTECHNOLOGY_OFFSET 63
#define PTP_MM_DEFAULT_DATA_SET_CLOCKUUIDFIELD_OFFSET 64
#define PTP_MM_DEFAULT_DATA_SET_CLOCKPORTFIELD_OFFSET 74
#define PTP_MM_DEFAULT_DATA_SET_CLOCKSTRATUM_OFFSET 79
#define PTP_MM_DEFAULT_DATA_SET_CLOCKIDENTIFIER_OFFSET 80
#define PTP_MM_DEFAULT_DATA_SET_CLOCKVARIANCE_OFFSET 86
#define PTP_MM_DEFAULT_DATA_SET_CLOCKFOLLOWUPCAPABLE_OFFSET 89
#define PTP_MM_DEFAULT_DATA_SET_PREFERRED_OFFSET 95
#define PTP_MM_DEFAULT_DATA_SET_INITIALIZABLE_OFFSET 99
#define PTP_MM_DEFAULT_DATA_SET_EXTERNALTIMING_OFFSET 103
#define PTP_MM_DEFAULT_DATA_SET_ISBOUNDARYCLOCK_OFFSET 107
#define PTP_MM_DEFAULT_DATA_SET_SYNCINTERVAL_OFFSET 111
#define PTP_MM_DEFAULT_DATA_SET_SUBDOMAINNAME_OFFSET 112
#define PTP_MM_DEFAULT_DATA_SET_NUMBERPORTS_OFFSET 130
#define PTP_MM_DEFAULT_DATA_SET_NUMBERFOREIGNRECORDS_OFFSET 134
/* PTP_MM_UPDATE_DEFAULT_DATA_SET (PARAMETERLENGTH = 36) */
#define PTP_MM_UPDATE_DEFAULT_DATA_SET_CLOCKSTRATUM_OFFSET 63
#define PTP_MM_UPDATE_DEFAULT_DATA_SET_CLOCKIDENTIFIER_OFFSET 64
#define PTP_MM_UPDATE_DEFAULT_DATA_SET_CLOCKVARIANCE_OFFSET 70
#define PTP_MM_UPDATE_DEFAULT_DATA_SET_PREFERRED_OFFSET 75
#define PTP_MM_UPDATE_DEFAULT_DATA_SET_SYNCINTERVAL_OFFSET 79
#define PTP_MM_UPDATE_DEFAULT_DATA_SET_SUBDOMAINNAME_OFFSET 80
/* PTP_MM_CURRENT_DATA_SET (PARAMETERLENGTH = 20) */
#define PTP_MM_CURRENT_DATA_SET_STEPSREMOVED_OFFSET 62
#define PTP_MM_CURRENT_DATA_SET_OFFSETFROMMASTER_OFFSET 64
#define PTP_MM_CURRENT_DATA_SET_OFFSETFROMMASTERSECONDS_OFFSET 64
#define PTP_MM_CURRENT_DATA_SET_OFFSETFROMMASTERNANOSECONDS_OFFSET 68
#define PTP_MM_CURRENT_DATA_SET_ONEWAYDELAY_OFFSET 72
#define PTP_MM_CURRENT_DATA_SET_ONEWAYDELAYSECONDS_OFFSET 72
#define PTP_MM_CURRENT_DATA_SET_ONEWAYDELAYNANOSECONDS_OFFSET 76
/* PTP_MM_PARENT_DATA_SET (PARAMETERLENGTH = 90) */
#define PTP_MM_PARENT_DATA_SET_PARENTCOMMUNICATIONTECHNOLOGY_OFFSET 63
#define PTP_MM_PARENT_DATA_SET_PARENTUUID_OFFSET 64
#define PTP_MM_PARENT_DATA_SET_PARENTPORTID_OFFSET 74
#define PTP_MM_PARENT_DATA_SET_PARENTLASTSYNCSEQUENCENUMBER_OFFSET 78
#define PTP_MM_PARENT_DATA_SET_PARENTFOLLOWUPCAPABLE_OFFSET 83
#define PTP_MM_PARENT_DATA_SET_PARENTEXTERNALTIMING_OFFSET 87
#define PTP_MM_PARENT_DATA_SET_PARENTVARIANCE_OFFSET 90
#define PTP_MM_PARENT_DATA_SET_PARENTSTATS_OFFSET 95
#define PTP_MM_PARENT_DATA_SET_OBSERVEDVARIANCE_OFFSET 98
#define PTP_MM_PARENT_DATA_SET_OBSERVEDDRIFT_OFFSET 100
#define PTP_MM_PARENT_DATA_SET_UTCREASONABLE_OFFSET 107
#define PTP_MM_PARENT_DATA_SET_GRANDMASTERCOMMUNICATIONTECHNOLOGY_OFFSET 111
#define PTP_MM_PARENT_DATA_SET_GRANDMASTERUUIDFIELD_OFFSET 112
#define PTP_MM_PARENT_DATA_SET_GRANDMASTERPORTIDFIELD_OFFSET 122
#define PTP_MM_PARENT_DATA_SET_GRANDMASTERSTRATUM_OFFSET 127
#define PTP_MM_PARENT_DATA_SET_GRANDMASTERIDENTIFIER_OFFSET 128
#define PTP_MM_PARENT_DATA_SET_GRANDMASTERVARIANCE_OFFSET 134
#define PTP_MM_PARENT_DATA_SET_GRANDMASTERPREFERRED_OFFSET 139
#define PTP_MM_PARENT_DATA_SET_GRANDMASTERISBOUNDARYCLOCK_OFFSET 143
#define PTP_MM_PARENT_DATA_SET_GRANDMASTERSEQUENCENUMBER_OFFSET 146
/* PTP_MM_PORT_DATA_SET (PARAMETERLENGTH = 52) */
#define PTP_MM_PORT_DATA_SET_RETURNEDPORTNUMBER_OFFSET 62
#define PTP_MM_PORT_DATA_SET_PORTSTATE_OFFSET 67
#define PTP_MM_PORT_DATA_SET_LASTSYNCEVENTSEQUENCENUMBER_OFFSET 70
#define PTP_MM_PORT_DATA_SET_LASTGENERALEVENTSEQUENCENUMBER_OFFSET 74
#define PTP_MM_PORT_DATA_SET_PORTCOMMUNICATIONTECHNOLOGY_OFFSET 79
#define PTP_MM_PORT_DATA_SET_PORTUUIDFIELD_OFFSET 80
#define PTP_MM_PORT_DATA_SET_PORTIDFIELD_OFFSET 90
#define PTP_MM_PORT_DATA_SET_BURSTENABLED_OFFSET 95
#define PTP_MM_PORT_DATA_SET_SUBDOMAINADDRESSOCTETS_OFFSET 97
#define PTP_MM_PORT_DATA_SET_EVENTPORTADDRESSOCTETS_OFFSET 98
#define PTP_MM_PORT_DATA_SET_GENERALPORTADDRESSOCTETS_OFFSET 99
#define PTP_MM_PORT_DATA_SET_SUBDOMAINADDRESS_OFFSET 100
#define PTP_MM_PORT_DATA_SET_EVENTPORTADDRESS_OFFSET 106
#define PTP_MM_PORT_DATA_SET_GENERALPORTADDRESS_OFFSET 110
/* PTP_MM_GLOBAL_TIME_DATA_SET (PARAMETERLENGTH = 24) */
#define PTP_MM_GLOBAL_TIME_DATA_SET_LOCALTIME_OFFSET 60
#define PTP_MM_GLOBAL_TIME_DATA_SET_LOCALTIMESECONDS_OFFSET 60
#define PTP_MM_GLOBAL_TIME_DATA_SET_LOCALTIMENANOSECONDS_OFFSET 64
#define PTP_MM_GLOBAL_TIME_DATA_SET_CURRENTUTCOFFSET_OFFSET 70
#define PTP_MM_GLOBAL_TIME_DATA_SET_LEAP59_OFFSET 75
#define PTP_MM_GLOBAL_TIME_DATA_SET_LEAP61_OFFSET 79
#define PTP_MM_GLOBAL_TIME_DATA_SET_EPOCHNUMBER_OFFSET 82
/* PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES (PARAMETERLENGTH = 16) */
#define PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES_CURRENTUTCOFFSET_OFFSET 62
#define PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES_LEAP59_OFFSET 67
#define PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES_LEAP61_OFFSET 71
#define PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES_EPOCHNUMBER_OFFSET 74
/* PTP_MM_GET_FOREIGN_DATA_SET (PARAMETERLENGTH = 4) */
#define PTP_MM_GET_FOREIGN_DATA_SET_RECORDKEY_OFFSET 62
/* PTP_MM_FOREIGN_DATA_SET (PARAMETERLENGTH = 28) */
#define PTP_MM_FOREIGN_DATA_SET_RETURNEDPORTNUMBER_OFFSET 62
#define PTP_MM_FOREIGN_DATA_SET_RETURNEDRECORDNUMBER_OFFSET 66
#define PTP_MM_FOREIGN_DATA_SET_FOREIGNMASTERCOMMUNICATIONTECHNOLOGY_OFFSET 71
#define PTP_MM_FOREIGN_DATA_SET_FOREIGNMASTERUUIDFIELD_OFFSET 72
#define PTP_MM_FOREIGN_DATA_SET_FOREIGNMASTERPORTIDFIELD_OFFSET 82
#define PTP_MM_FOREIGN_DATA_SET_FOREIGNMASTERSYNCS_OFFSET 86
/* PTP_MM_SET_SYNC_INTERVAL (PARAMETERLENGTH = 4) */
#define PTP_MM_SET_SYNC_INTERVAL_SYNCINTERVAL_OFFSET 62
/* PTP_MM_SET_TIME (PARAMETERLENGTH = 8) */
#define PTP_MM_SET_TIME_LOCALTIME_OFFSET 60
#define PTP_MM_SET_TIME_LOCALTIMESECONDS_OFFSET 60
#define PTP_MM_SET_TIME_LOCALTIMENANOSECONDS_OFFSET 64
/* END Offsets of fields within a PTP packet. */
/**********************************************************/
/* flag-field-mask-definitions */
/**********************************************************/
#define PTP_FLAGS_LI61_BITMASK 0x01
#define PTP_FLAGS_LI59_BITMASK 0x02
#define PTP_FLAGS_BOUNDARY_CLOCK_BITMASK 0x04
#define PTP_FLAGS_ASSIST_BITMASK 0x08
#define PTP_FLAGS_EXT_SYNC_BITMASK 0x10
#define PTP_FLAGS_PARENT_STATS_BITMASK 0x20
#define PTP_FLAGS_SYNC_BURST_BITMASK 0x40
/* END flag-field-mask-definitions */
/**********************************************************/
/* managementMessage definitions */
/**********************************************************/
#define PTP_MM_NULL 0
#define PTP_MM_OBTAIN_IDENTITY 1
#define PTP_MM_CLOCK_IDENTITY 2
#define PTP_MM_INITIALIZE_CLOCK 3
#define PTP_MM_SET_SUBDOMAIN 4
#define PTP_MM_CLEAR_DESIGNATED_PREFERRED_MASTER 5
#define PTP_MM_SET_DESIGNATED_PREFERRED_MASTER 6
#define PTP_MM_GET_DEFAULT_DATA_SET 7
#define PTP_MM_DEFAULT_DATA_SET 8
#define PTP_MM_UPDATE_DEFAULT_DATA_SET 9
#define PTP_MM_GET_CURRENT_DATA_SET 10
#define PTP_MM_CURRENT_DATA_SET 11
#define PTP_MM_GET_PARENT_DATA_SET 12
#define PTP_MM_PARENT_DATA_SET 13
#define PTP_MM_GET_PORT_DATA_SET 14
#define PTP_MM_PORT_DATA_SET 15
#define PTP_MM_GET_GLOBAL_TIME_DATA_SET 16
#define PTP_MM_GLOBAL_TIME_DATA_SET 17
#define PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES 18
#define PTP_MM_GOTO_FAULTY_STATE 19
#define PTP_MM_GET_FOREIGN_DATA_SET 20
#define PTP_MM_FOREIGN_DATA_SET 21
#define PTP_MM_SET_SYNC_INTERVAL 22
#define PTP_MM_DISABLE_PORT 23
#define PTP_MM_ENABLE_PORT 24
#define PTP_MM_DISABLE_BURST 25
#define PTP_MM_ENABLE_BURST 26
#define PTP_MM_SET_TIME 27
static const value_string ptp_managementMessageKey_vals[] = {
{PTP_MM_NULL , "PTP_MM_NULL"},
{PTP_MM_OBTAIN_IDENTITY , "PTP_MM_OBTAIN_IDENTITY"},
{PTP_MM_CLOCK_IDENTITY , "PTP_MM_CLOCK_IDENTITY"},
{PTP_MM_INITIALIZE_CLOCK , "PTP_MM_INITIALIZE_CLOCK"},
{PTP_MM_SET_SUBDOMAIN , "PTP_MM_SET_SUBDOMAIN"},
{PTP_MM_CLEAR_DESIGNATED_PREFERRED_MASTER , "PTP_MM_CLEAR_DESIGNATED_PREFERRED_MASTER"},
{PTP_MM_SET_DESIGNATED_PREFERRED_MASTER , "PTP_MM_SET_DESIGNATED_PREFERRED_MASTER"},
{PTP_MM_GET_DEFAULT_DATA_SET , "PTP_MM_GET_DEFAULT_DATA_SET"},
{PTP_MM_DEFAULT_DATA_SET , "PTP_MM_DEFAULT_DATA_SET"},
{PTP_MM_UPDATE_DEFAULT_DATA_SET , "PTP_MM_UPDATE_DEFAULT_DATA_SET"},
{PTP_MM_GET_CURRENT_DATA_SET , "PTP_MM_GET_CURRENT_DATA_SET"},
{PTP_MM_CURRENT_DATA_SET , "PTP_MM_CURRENT_DATA_SET"},
{PTP_MM_GET_PARENT_DATA_SET , "PTP_MM_GET_PARENT_DATA_SET"},
{PTP_MM_PARENT_DATA_SET , "PTP_MM_PARENT_DATA_SET"},
{PTP_MM_GET_PORT_DATA_SET , "PTP_MM_GET_PORT_DATA_SET"},
{PTP_MM_PORT_DATA_SET , "PTP_MM_PORT_DATA_SET"},
{PTP_MM_GET_GLOBAL_TIME_DATA_SET , "PTP_MM_GET_GLOBAL_TIME_DATA_SET"},
{PTP_MM_GLOBAL_TIME_DATA_SET , "PTP_MM_GLOBAL_TIME_DATA_SET"},
{PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES , "PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES"},
{PTP_MM_GOTO_FAULTY_STATE , "PTP_MM_GOTO_FAULTY_STATE"},
{PTP_MM_GET_FOREIGN_DATA_SET , "PTP_MM_GET_FOREIGN_DATA_SET"},
{PTP_MM_FOREIGN_DATA_SET , "PTP_MM_FOREIGN_DATA_SET"},
{PTP_MM_SET_SYNC_INTERVAL , "PTP_MM_SET_SYNC_INTERVAL"},
{PTP_MM_DISABLE_PORT , "PTP_MM_DISABLE_PORT"},
{PTP_MM_ENABLE_PORT , "PTP_MM_ENABLE_PORT"},
{PTP_MM_DISABLE_BURST , "PTP_MM_DISABLE_BURST"},
{PTP_MM_ENABLE_BURST , "PTP_MM_ENABLE_BURST"},
{PTP_MM_SET_TIME , "PTP_MM_SET_TIME"},
{0, NULL }
};
static value_string_ext ptp_managementMessageKey_vals_ext =
VALUE_STRING_EXT_INIT(ptp_managementMessageKey_vals);
/* same again but better readable text for info column */
static const value_string ptp_managementMessageKey_infocolumn_vals[] = {
{PTP_MM_NULL , "Null"},
{PTP_MM_OBTAIN_IDENTITY , "Obtain Identity"},
{PTP_MM_CLOCK_IDENTITY , "Clock Identity"},
{PTP_MM_INITIALIZE_CLOCK , "Initialize Clock"},
{PTP_MM_SET_SUBDOMAIN , "Set Subdomain"},
{PTP_MM_CLEAR_DESIGNATED_PREFERRED_MASTER , "Clear Designated Preferred Master"},
{PTP_MM_SET_DESIGNATED_PREFERRED_MASTER , "Set Designated Preferred Master"},
{PTP_MM_GET_DEFAULT_DATA_SET , "Get Default Data Set"},
{PTP_MM_DEFAULT_DATA_SET , "Default Data Set"},
{PTP_MM_UPDATE_DEFAULT_DATA_SET , "Update Default Data Set"},
{PTP_MM_GET_CURRENT_DATA_SET , "Get Current Data Set"},
{PTP_MM_CURRENT_DATA_SET , "Current Data Set"},
{PTP_MM_GET_PARENT_DATA_SET , "Get Parent Data Set"},
{PTP_MM_PARENT_DATA_SET , "Parent Data Set"},
{PTP_MM_GET_PORT_DATA_SET , "Get Port Data Set"},
{PTP_MM_PORT_DATA_SET , "Port Data Set"},
{PTP_MM_GET_GLOBAL_TIME_DATA_SET , "Get Global Time Data Set"},
{PTP_MM_GLOBAL_TIME_DATA_SET , "Global Time Data Set"},
{PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES , "Update Global Time Properties"},
{PTP_MM_GOTO_FAULTY_STATE , "Goto Faulty State"},
{PTP_MM_GET_FOREIGN_DATA_SET , "Get Foreign Data Set"},
{PTP_MM_FOREIGN_DATA_SET , "Foreign Data Set"},
{PTP_MM_SET_SYNC_INTERVAL , "Set Sync Interval"},
{PTP_MM_DISABLE_PORT , "Disable Port"},
{PTP_MM_ENABLE_PORT , "Enable Port"},
{PTP_MM_DISABLE_BURST , "Disable Burst"},
{PTP_MM_ENABLE_BURST , "Enable Burst"},
{PTP_MM_SET_TIME , "Set Time"},
{0, NULL }
};
static value_string_ext ptp_managementMessageKey_infocolumn_vals_ext =
VALUE_STRING_EXT_INIT(ptp_managementMessageKey_infocolumn_vals);
/* END managementMessage definitions */
/**********************************************************/
/* CommunicationId definitions */
/**********************************************************/
#define PTP_CLOSED 0
#define PTP_ETHER 1
#define PTP_FFBUS 4
#define PTP_PROFIBUS 5
#define PTP_LON 6
#define PTP_DNET 7
#define PTP_SDS 8
#define PTP_CONTROLNET 9
#define PTP_CANOPEN 10
#define PTP_IEEE1394 243
#define PTP_IEEE802_11A 244
#define PTP_IEEE_WIRELESS 245
#define PTP_INFINIBAND 246
#define PTP_BLUETOOTH 247
#define PTP_IEEE802_15_1 248
#define PTP_IEEE1451_3 249
#define PTP_IEEE1451_5 250
#define PTP_USB 251
#define PTP_ISA 252
#define PTP_PCI 253
#define PTP_VXI 254
#define PTP_DEFAULT 255
static const value_string ptp_communicationid_vals[] = {
{PTP_CLOSED , "Closed system outside the scope of this standard."},
{PTP_ETHER , "IEEE 802.3 (Ethernet)"},
{PTP_FFBUS , "FOUNDATION Fieldbus"},
{PTP_PROFIBUS , "PROFIBUS"},
{PTP_LON , "LonTalk"},
{PTP_DNET , "DeviceNet"},
{PTP_SDS , "SmartDistributedSystem"},
{PTP_CONTROLNET , "ControlNet"},
{PTP_CANOPEN , "CANopen"},
{PTP_IEEE1394 , "IEEE 1394"},
{PTP_IEEE802_11A , "IEEE 802.11a"},
{PTP_IEEE_WIRELESS , "IEEE 802.11b"},
{PTP_INFINIBAND , "InfiniBand"},
{PTP_BLUETOOTH , "Bluetooth wireless"},
{PTP_IEEE802_15_1 , "IEEE 802.15.1"},
{PTP_IEEE1451_3 , "IEEE 1451.3"},
{PTP_IEEE1451_5 , "IEEE 1451.5"},
{PTP_USB , "USB bus"},
{PTP_ISA , "ISA bus"},
{PTP_PCI , "PCI bus"},
{PTP_VXI , "VXI bus"},
{PTP_DEFAULT , "Default value"},
{0, NULL }
};
static value_string_ext ptp_communicationid_vals_ext =
VALUE_STRING_EXT_INIT(ptp_communicationid_vals);
/* END CommunicationId definitions */
/**********************************************************/
/* PTP message types (PTP_CONTROL field) */
/**********************************************************/
#define PTP_SYNC_MESSAGE 0x00
#define PTP_DELAY_REQ_MESSAGE 0x01
#define PTP_FOLLOWUP_MESSAGE 0x02
#define PTP_DELAY_RESP_MESSAGE 0x03
#define PTP_MANAGEMENT_MESSAGE 0x04
#define PTP_OTHER_MESSAGE 0x05
static const value_string ptp_control_vals[] = {
{PTP_SYNC_MESSAGE , "Sync Message"},
{PTP_DELAY_REQ_MESSAGE , "Delay_Req Message"},
{PTP_FOLLOWUP_MESSAGE , "Follow_Up Message"},
{PTP_DELAY_RESP_MESSAGE , "Delay_Resp Message"},
{PTP_MANAGEMENT_MESSAGE , "Management Message"},
{PTP_OTHER_MESSAGE , "Other Message"},
{0, NULL }
};
/* END PTP message types */
/**********************************************************/
/* Channel values for the PTP_MESSAGETYPE field */
/**********************************************************/
#define PTP_MESSAGETYPE_EVENT 0x01
#define PTP_MESSAGETYPE_GENERAL 0x02
static const value_string ptp_messagetype_vals[] = {
{PTP_MESSAGETYPE_EVENT , "Event Message"},
{PTP_MESSAGETYPE_GENERAL , "General Message"},
{0, NULL }
};
/* END channel values for the PTP_MESSAGETYPE field */
/**********************************************************/
/* Initialize the protocol and registered fields */
/**********************************************************/
static int hf_ptp_versionptp = -1;
static int hf_ptp_versionnetwork = -1;
static int hf_ptp_subdomain = -1;
static int hf_ptp_messagetype = -1;
static int hf_ptp_sourcecommunicationtechnology = -1;
static int hf_ptp_sourceuuid = -1;
static int hf_ptp_sourceportid = -1;
static int hf_ptp_sequenceid = -1;
static int hf_ptp_control = -1;
static int hf_ptp_flags = -1;
static int hf_ptp_flags_li61 = -1;
static int hf_ptp_flags_li59 = -1;
static int hf_ptp_flags_boundary_clock = -1;
static int hf_ptp_flags_assist = -1;
static int hf_ptp_flags_ext_sync = -1;
static int hf_ptp_flags_parent = -1;
static int hf_ptp_flags_sync_burst = -1;
/* Fields for ptp_sync and delay_req (=sdr) messages */
static int hf_ptp_sdr_origintimestamp = -1; /* Field for seconds & nanoseconds */
static int hf_ptp_sdr_origintimestamp_seconds = -1;
static int hf_ptp_sdr_origintimestamp_nanoseconds = -1;
static int hf_ptp_sdr_epochnumber = -1;
static int hf_ptp_sdr_currentutcoffset = -1;
static int hf_ptp_sdr_grandmastercommunicationtechnology = -1;
static int hf_ptp_sdr_grandmasterclockuuid = -1;
static int hf_ptp_sdr_grandmasterportid = -1;
static int hf_ptp_sdr_grandmastersequenceid = -1;
static int hf_ptp_sdr_grandmasterclockstratum = -1;
static int hf_ptp_sdr_grandmasterclockidentifier = -1;
static int hf_ptp_sdr_grandmasterclockvariance = -1;
static int hf_ptp_sdr_grandmasterpreferred = -1;
static int hf_ptp_sdr_grandmasterisboundaryclock = -1;
static int hf_ptp_sdr_syncinterval = -1;
static int hf_ptp_sdr_localclockvariance = -1;
static int hf_ptp_sdr_localstepsremoved = -1;
static int hf_ptp_sdr_localclockstratum = -1;
static int hf_ptp_sdr_localclockidentifier = -1;
static int hf_ptp_sdr_parentcommunicationtechnology = -1;
static int hf_ptp_sdr_parentuuid = -1;
static int hf_ptp_sdr_parentportfield = -1;
static int hf_ptp_sdr_estimatedmastervariance = -1;
static int hf_ptp_sdr_estimatedmasterdrift = -1;
static int hf_ptp_sdr_utcreasonable = -1;
/* Fields for follow_up (=fu) messages */
static int hf_ptp_fu_associatedsequenceid = -1;
static int hf_ptp_fu_preciseorigintimestamp = -1;
static int hf_ptp_fu_preciseorigintimestamp_seconds = -1;
static int hf_ptp_fu_preciseorigintimestamp_nanoseconds = -1;
/* Fields for delay_resp (=dr) messages */
static int hf_ptp_dr_delayreceipttimestamp = -1;
static int hf_ptp_dr_delayreceipttimestamp_seconds = -1;
static int hf_ptp_dr_delayreceipttimestamp_nanoseconds = -1;
static int hf_ptp_dr_requestingsourcecommunicationtechnology = -1;
static int hf_ptp_dr_requestingsourceuuid = -1;
static int hf_ptp_dr_requestingsourceportid = -1;
static int hf_ptp_dr_requestingsourcesequenceid = -1;
/* Fields for management (=mm) messages */
static int hf_ptp_mm_targetcommunicationtechnology = -1;
static int hf_ptp_mm_targetuuid = -1;
static int hf_ptp_mm_targetportid = -1;
static int hf_ptp_mm_startingboundaryhops = -1;
static int hf_ptp_mm_boundaryhops = -1;
static int hf_ptp_mm_managementmessagekey = -1;
static int hf_ptp_mm_parameterlength = -1;
/* parameterlength > 0 */
/* static int hf_ptp_mm_messageparameters = -1; */
/* ptp_mm_clock_identity (parameterlength = 64) */
static int hf_ptp_mm_clock_identity_clockcommunicationtechnology = -1;
static int hf_ptp_mm_clock_identity_clockuuidfield = -1;
static int hf_ptp_mm_clock_identity_clockportfield = -1;
static int hf_ptp_mm_clock_identity_manufactureridentity = -1;
/* ptp_mm_initialize_clock (parameterlength = 4) */
static int hf_ptp_mm_initialize_clock_initialisationkey = -1;
/* ptp_mm_set_subdomain (parameterlength = 16) */
static int hf_ptp_mm_set_subdomain_subdomainname = -1;
/* ptp_mm_default_data_set (parameterlength = 76) */
static int hf_ptp_mm_default_data_set_clockcommunicationtechnology = -1;
static int hf_ptp_mm_default_data_set_clockuuidfield = -1;
static int hf_ptp_mm_default_data_set_clockportfield = -1;
static int hf_ptp_mm_default_data_set_clockstratum = -1;
static int hf_ptp_mm_default_data_set_clockidentifier = -1;
static int hf_ptp_mm_default_data_set_clockvariance = -1;
static int hf_ptp_mm_default_data_set_clockfollowupcapable = -1;
static int hf_ptp_mm_default_data_set_preferred = -1;
static int hf_ptp_mm_default_data_set_initializable = -1;
static int hf_ptp_mm_default_data_set_externaltiming = -1;
static int hf_ptp_mm_default_data_set_isboundaryclock = -1;
static int hf_ptp_mm_default_data_set_syncinterval = -1;
static int hf_ptp_mm_default_data_set_subdomainname = -1;
static int hf_ptp_mm_default_data_set_numberports = -1;
static int hf_ptp_mm_default_data_set_numberforeignrecords = -1;
/* ptp_mm_update_default_data_set (parameterlength = 36) */
static int hf_ptp_mm_update_default_data_set_clockstratum = -1;
static int hf_ptp_mm_update_default_data_set_clockidentifier = -1;
static int hf_ptp_mm_update_default_data_set_clockvariance = -1;
static int hf_ptp_mm_update_default_data_set_preferred = -1;
static int hf_ptp_mm_update_default_data_set_syncinterval = -1;
static int hf_ptp_mm_update_default_data_set_subdomainname = -1;
/* ptp_mm_current_data_set (parameterlength = 20) */
static int hf_ptp_mm_current_data_set_stepsremoved = -1;
static int hf_ptp_mm_current_data_set_offsetfrommaster = -1;
static int hf_ptp_mm_current_data_set_offsetfrommasterseconds = -1;
static int hf_ptp_mm_current_data_set_offsetfrommasternanoseconds = -1;
static int hf_ptp_mm_current_data_set_onewaydelay = -1;
static int hf_ptp_mm_current_data_set_onewaydelayseconds = -1;
static int hf_ptp_mm_current_data_set_onewaydelaynanoseconds = -1;
/* ptp_mm_parent_data_set (parameterlength = 90) */
static int hf_ptp_mm_parent_data_set_parentcommunicationtechnology = -1;
static int hf_ptp_mm_parent_data_set_parentuuid = -1;
static int hf_ptp_mm_parent_data_set_parentportid = -1;
static int hf_ptp_mm_parent_data_set_parentlastsyncsequencenumber = -1;
static int hf_ptp_mm_parent_data_set_parentfollowupcapable = -1;
static int hf_ptp_mm_parent_data_set_parentexternaltiming = -1;
static int hf_ptp_mm_parent_data_set_parentvariance = -1;
static int hf_ptp_mm_parent_data_set_parentstats = -1;
static int hf_ptp_mm_parent_data_set_observedvariance = -1;
static int hf_ptp_mm_parent_data_set_observeddrift = -1;
static int hf_ptp_mm_parent_data_set_utcreasonable = -1;
static int hf_ptp_mm_parent_data_set_grandmastercommunicationtechnology = -1;
static int hf_ptp_mm_parent_data_set_grandmasteruuidfield = -1;
static int hf_ptp_mm_parent_data_set_grandmasterportidfield = -1;
static int hf_ptp_mm_parent_data_set_grandmasterstratum = -1;
static int hf_ptp_mm_parent_data_set_grandmasteridentifier = -1;
static int hf_ptp_mm_parent_data_set_grandmastervariance = -1;
static int hf_ptp_mm_parent_data_set_grandmasterpreferred = -1;
static int hf_ptp_mm_parent_data_set_grandmasterisboundaryclock = -1;
static int hf_ptp_mm_parent_data_set_grandmastersequencenumber = -1;
/* ptp_mm_port_data_set (parameterlength = 52) */
static int hf_ptp_mm_port_data_set_returnedportnumber = -1;
static int hf_ptp_mm_port_data_set_portstate = -1;
static int hf_ptp_mm_port_data_set_lastsynceventsequencenumber = -1;
static int hf_ptp_mm_port_data_set_lastgeneraleventsequencenumber = -1;
static int hf_ptp_mm_port_data_set_portcommunicationtechnology = -1;
static int hf_ptp_mm_port_data_set_portuuidfield = -1;
static int hf_ptp_mm_port_data_set_portidfield = -1;
static int hf_ptp_mm_port_data_set_burstenabled = -1;
static int hf_ptp_mm_port_data_set_subdomainaddressoctets = -1;
static int hf_ptp_mm_port_data_set_eventportaddressoctets = -1;
static int hf_ptp_mm_port_data_set_generalportaddressoctets = -1;
static int hf_ptp_mm_port_data_set_subdomainaddress = -1;
static int hf_ptp_mm_port_data_set_eventportaddress = -1;
static int hf_ptp_mm_port_data_set_generalportaddress = -1;
/* ptp_mm_global_time_data_set (parameterlength = 24) */
static int hf_ptp_mm_global_time_data_set_localtime = -1;
static int hf_ptp_mm_global_time_data_set_localtimeseconds = -1;
static int hf_ptp_mm_global_time_data_set_localtimenanoseconds = -1;
static int hf_ptp_mm_global_time_data_set_currentutcoffset = -1;
static int hf_ptp_mm_global_time_data_set_leap59 = -1;
static int hf_ptp_mm_global_time_data_set_leap61 = -1;
static int hf_ptp_mm_global_time_data_set_epochnumber = -1;
/* ptp_mm_update_global_time_properties (parameterlength = 16) */
static int hf_ptp_mm_update_global_time_properties_currentutcoffset = -1;
static int hf_ptp_mm_update_global_time_properties_leap59 = -1;
static int hf_ptp_mm_update_global_time_properties_leap61 = -1;
/* static int hf_ptp_mm_update_global_time_properties_epochnumber = -1; */
/* ptp_mm_get_foreign_data_set (parameterlength = 4) */
static int hf_ptp_mm_get_foreign_data_set_recordkey = -1;
/* ptp_mm_foreign_data_set (parameterlength = 28) */
static int hf_ptp_mm_foreign_data_set_returnedportnumber = -1;
static int hf_ptp_mm_foreign_data_set_returnedrecordnumber = -1;
static int hf_ptp_mm_foreign_data_set_foreignmastercommunicationtechnology = -1;
static int hf_ptp_mm_foreign_data_set_foreignmasteruuidfield = -1;
static int hf_ptp_mm_foreign_data_set_foreignmasterportidfield = -1;
static int hf_ptp_mm_foreign_data_set_foreignmastersyncs = -1;
/* ptp_mm_set_sync_interval (parameterlength = 4) */
static int hf_ptp_mm_set_sync_interval_syncinterval = -1;
/* ptp_mm_set_time (parameterlength = 8) */
static int hf_ptp_mm_set_time_localtime = -1;
static int hf_ptp_mm_set_time_localtimeseconds = -1;
static int hf_ptp_mm_set_time_localtimenanoseconds = -1;
/* END Initialize the protocol and registered fields */
/* Initialize the subtree pointers */
static gint ett_ptp = -1;
static gint ett_ptp_flags = -1;
static gint ett_ptp_time = -1;
static gint ett_ptp_time2 = -1;
/* END Definitions and fields for PTPv1 dissection. */
/***********************************************************************************/
/* Definitions and fields for PTPv2 dissection. */
/***********************************************************************************/
/**********************************************************/
/* Offsets of fields within a PTPv2 packet. */
/**********************************************************/
/* Common offsets for all Messages (Sync, Delay_Req, Follow_Up, Delay_Resp ....) */
#define PTP_V2_TRANSPORT_SPECIFIC_MESSAGE_ID_OFFSET 0
#define PTP_V2_VERSIONPTP_OFFSET 1
#define PTP_V2_MESSAGE_LENGTH_OFFSET 2
#define PTP_V2_DOMAIN_NUMBER_OFFSET 4
#define PTP_V2_FLAGS_OFFSET 6
#define PTP_V2_CORRECTION_OFFSET 8
#define PTP_V2_CORRECTIONNS_OFFSET 8
#define PTP_V2_CORRECTIONSUBNS_OFFSET 14
#define PTP_V2_CLOCKIDENTITY_OFFSET 20
#define PTP_V2_SOURCEPORTID_OFFSET 28
#define PTP_V2_SEQUENCEID_OFFSET 30
#define PTP_V2_CONTROL_OFFSET 32
#define PTP_V2_LOGMESSAGEPERIOD_OFFSET 33
/* Offsets for PTP_Announce (=AN) messages */
#define PTP_V2_AN_ORIGINTIMESTAMP_OFFSET 34
#define PTP_V2_AN_ORIGINTIMESTAMPSECONDS_OFFSET 34
#define PTP_V2_AN_ORIGINTIMESTAMPNANOSECONDS_OFFSET 40
#define PTP_V2_AN_ORIGINCURRENTUTCOFFSET_OFFSET 44
#define PTP_V2_AN_PRIORITY_1_OFFSET 47
#define PTP_V2_AN_GRANDMASTERCLOCKCLASS_OFFSET 48
#define PTP_V2_AN_GRANDMASTERCLOCKACCURACY_OFFSET 49
#define PTP_V2_AN_GRANDMASTERCLOCKVARIANCE_OFFSET 50
#define PTP_V2_AN_PRIORITY_2_OFFSET 52
#define PTP_V2_AN_GRANDMASTERCLOCKIDENTITY_OFFSET 53
#define PTP_V2_AN_LOCALSTEPSREMOVED_OFFSET 61
#define PTP_V2_AN_TIMESOURCE_OFFSET 63
#define PTP_V2_AN_TLV_OFFSET 64 /* TLV only used if message length is > 64 bytes */
/* Announce TLV field offsets */
#define PTP_V2_AN_TLV_TYPE_OFFSET 0
#define PTP_V2_AN_TLV_LENGTHFIELD_OFFSET 2
/* PTP_V2_TLV_TYPE_ORGANIZATION_EXTENSION field offsets */
#define PTP_V2_AN_TLV_OE_ORGANIZATIONID_OFFSET 4
#define PTP_V2_AN_TLV_OE_ORGANIZATIONSUBTYPE_OFFSET 7
#define PTP_V2_AN_TLV_OE_DATAFIELD_OFFSET 10
/* PTPv2 IEEE_C37_238 TLV (organization extension subtype) field offsets */
#define PTP_V2_AN_TLV_OE_IEEEC37238TLV_GMID_OFFSET 10
#define PTP_V2_AN_TLV_OE_IEEEC37238TLV_GMINACCURACY_OFFSET 12
#define PTP_V2_AN_TLV_OE_IEEEC37238TLV_NWINACCURACY_OFFSET 16
#define PTP_V2_AN_TLV_OE_IEEEC37238TLV_RESERVED_OFFSET 20
/* PTP_V2_TLV_TYPE_ALTERNATE_TIME_OFFSET_INDICATOR field offsets */
#define PTP_V2_AN_TLV_ATOI_KEYFIELD_OFFSET 4
#define PTP_V2_AN_TLV_ATOI_CURRENTOFFSET_OFFSET 5
#define PTP_V2_AN_TLV_ATOI_JUMPSECONDS_OFFSET 9
#define PTP_V2_AN_TLV_ATOI_TIMEOFNEXTJUMP_OFFSET 13
#define PTP_V2_AN_TLV_ATOI_DISPLAYNAME_OFFSET 19
/* Undissected TLV field offset */
#define PTP_V2_AN_TLV_DATA_OFFSET 4
/* 802.1AS Path Sequence Offset */
#define PTP_AS_AN_TLV_PATH_TRACE_OFFSET 4
/* Offsets for PTP_Sync AND PTP_DelayRequest (=SDR) messages */
#define PTP_V2_SDR_ORIGINTIMESTAMP_OFFSET 34
#define PTP_V2_SDR_ORIGINTIMESTAMPSECONDS_OFFSET 34
#define PTP_V2_SDR_ORIGINTIMESTAMPNANOSECONDS_OFFSET 40
/* Offsets for PTP_Follow_Up (=FU) messages */
#define PTP_V2_FU_PRECISEORIGINTIMESTAMP_OFFSET 34
#define PTP_V2_FU_PRECISEORIGINTIMESTAMPSECONDS_OFFSET 34
#define PTP_V2_FU_PRECISEORIGINTIMESTAMPNANOSECONDS_OFFSET 40
/* 802.1AS Follow_Up information TLV */
#define PTP_AS_FU_TLV_INFORMATION_OFFSET 44
/* 802.1AS Follow_Up TLV field offsets */
#define PTP_AS_FU_TLV_TYPE_OFFSET 0
#define PTP_AS_FU_TLV_LENGTHFIELD_OFFSET 2
#define PTP_AS_FU_TLV_ORGANIZATIONID_OFFSET 4
#define PTP_AS_FU_TLV_ORGANIZATIONSUBTYPE_OFFSET 7
#define PTP_AS_FU_TLV_CUMULATIVESCALEDRATEOFFSET_OFFSET 10
#define PTP_AS_FU_TLV_GMTIMEBASEINDICATOR_OFFSET 14
#define PTP_AS_FU_TLV_LASTGMPHASECHANGE_OFFSET 16
#define PTP_AS_FU_TLV_SCALEDLASTGMFREQCHANGE_OFFSET 28
/* Offsets for PTP_DelayResponse (=DR) messages */
#define PTP_V2_DR_RECEIVETIMESTAMP_OFFSET 34
#define PTP_V2_DR_RECEIVETIMESTAMPSECONDS_OFFSET 34
#define PTP_V2_DR_RECEIVETIMESTAMPNANOSECONDS_OFFSET 40
#define PTP_V2_DR_REQUESTINGPORTIDENTITY_OFFSET 44
#define PTP_V2_DR_REQUESTINGSOURCEPORTID_OFFSET 52
/* Offsets for PTP_PDelayRequest (=PDRQ) messages */
#define PTP_V2_PDRQ_ORIGINTIMESTAMP_OFFSET 34
#define PTP_V2_PDRQ_ORIGINTIMESTAMPSECONDS_OFFSET 34
#define PTP_V2_PDRQ_ORIGINTIMESTAMPNANOSECONDS_OFFSET 40
#define PTP_V2_PDRQ_RESERVED_OFFSET 44
/* Offsets for PTP_PDelayResponse (=PDRS) messages */
#define PTP_V2_PDRS_REQUESTRECEIPTTIMESTAMP_OFFSET 34
#define PTP_V2_PDRS_REQUESTRECEIPTTIMESTAMPSECONDS_OFFSET 34
#define PTP_V2_PDRS_REQUESTRECEIPTTIMESTAMPNANOSECONDS_OFFSET 40
#define PTP_V2_PDRS_REQUESTINGPORTIDENTITY_OFFSET 44 /* ++ */
#define PTP_V2_PDRS_REQUESTINGSOURCEPORTID_OFFSET 52 /* ++ */
/* Offsets for PTP_PDelayResponseFollowUp (=PDFU) messages */
#define PTP_V2_PDFU_RESPONSEORIGINTIMESTAMP_OFFSET 34
#define PTP_V2_PDFU_RESPONSEORIGINTIMESTAMPSECONDS_OFFSET 34
#define PTP_V2_PDFU_RESPONSEORIGINTIMESTAMPNANOSECONDS_OFFSET 40
#define PTP_V2_PDFU_REQUESTINGPORTIDENTITY_OFFSET 44 /* ++ */
#define PTP_V2_PDFU_REQUESTINGSOURCEPORTID_OFFSET 52
/* Offsets for PTP_Signalling (=SIG) messages */
#define PTP_V2_SIG_TARGETPORTIDENTITY_OFFSET 34
#define PTP_V2_SIG_TARGETPORTID_OFFSET 42
#define PTP_V2_SIG_TLV_START 44
/* Offset for PTP Signaling messages (relative to tlvOffset!) */
#define PTP_V2_SIG_TLV_TYPE_OFFSET 0
#define PTP_V2_SIG_TLV_LENGTH_OFFSET 2
#define PTP_V2_SIG_TLV_VALUE_OFFSET 4
#define PTP_V2_SIG_TLV_MESSAGE_TYPE_OFFSET 4
#define PTP_V2_SIG_TLV_LOG_INTER_MESSAGE_PERIOD_OFFSET 5
#define PTP_V2_SIG_TLV_DURATION_FIELD_OFFSET 6
#define PTP_V2_SIG_TLV_RENEWAL_INVITED_OFFSET 11
#define PTP_V2_SIG_TLV_TYPE_LEN 2
#define PTP_V2_SIG_TLV_LENGTH_LEN 2
#define PTP_V2_SIG_TLV_MESSAGE_TYPE_LEN 1
#define PTP_V2_SIG_TLV_LOG_INTER_MESSAGE_PERIOD_LEN 1
#define PTP_V2_SIG_TLV_DURATION_FIELD_LEN 4
#define PTP_V2_SIG_TLV_RENEWAL_INVITED_LEN 1
/* 802.1AS Signalling Message Interval Request TLV */
#define PTP_AS_SIG_TLV_MESSAGEINTERVALREQUEST_OFFSET 44
/* 802.1AS Signalling TLV field offsets */
#define PTP_AS_SIG_TLV_TYPE_OFFSET 0
#define PTP_AS_SIG_TLV_LENGTHFIELD_OFFSET 2
#define PTP_AS_SIG_TLV_ORGANIZATIONID_OFFSET 4
#define PTP_AS_SIG_TLV_ORGANIZATIONSUBTYPE_OFFSET 7
#define PTP_AS_SIG_TLV_LINKDELAYINTERVAL_OFFSET 10
#define PTP_AS_SIG_TLV_TIMESYNCINTERVAL_OFFSET 11
#define PTP_AS_SIG_TLV_ANNOUNCEINTERVAL_OFFSET 12
#define PTP_AS_SIG_TLV_FLAGS_OFFSET 13
/**********************************************************/
/* Message Interval Request flag-field-mask-definitions */
/**********************************************************/
#define PTP_AS_FLAGS_COMP_NEIGHBOR_RATE_RATIO_BITMASK 0x0002
#define PTP_AS_FLAGS_COMP_NEIGHBOR_PROP_DELAY_BITMASK 0x0004
/* Offsets for PTP_V2_Management (=MM) messages */
#define PTP_V2_MM_TARGETPORTIDENTITY_OFFSET 34
#define PTP_V2_MM_TARGETPORTID_OFFSET 42
#define PTP_V2_MM_STARTINGBOUNDARYHOPS_OFFSET 44
#define PTP_V2_MM_BOUNDARYHOPS_OFFSET 45
#define PTP_V2_MM_ACTION_OFFSET 46
#define PTP_V2_MM_RESERVED_OFFSET 47
#define PTP_V2_MM_MANAGEMENTTLV_OFFSET 48
/* Management TLV */
#define PTP_V2_MM_TLV_TYPE_OFFSET 48
#define PTP_V2_MM_TLV_LENGTHFIELD_OFFSET 50
#define PTP_V2_MM_TLV_MANAGEMENTID_OFFSET 52
#define PTP_V2_MM_TLV_MANAGEMENTERRORID_OFFSET 52
#define PTP_V2_MM_TLV_DATAFIELD_OFFSET 54
/* TLV Types */
#define PTP_V2_TLV_TYPE_RESERVED 0x0000
#define PTP_V2_TLV_TYPE_MANAGEMENT 0x0001
#define PTP_V2_TLV_TYPE_MANAGEMENT_ERROR_STATUS 0x0002
#define PTP_V2_TLV_TYPE_ORGANIZATION_EXTENSION 0x0003
#define PTP_V2_TLV_TYPE_REQUEST_UNICAST_TRANSMISSION 0x0004
#define PTP_V2_TLV_TYPE_GRANT_UNICAST_TRANSMISSION 0x0005
#define PTP_V2_TLV_TYPE_CANCEL_UNICAST_TRANSMISSION 0x0006
#define PTP_V2_TLV_TYPE_ACKNOWLEDGE_CANCEL_UNICAST_TRANSMISSION 0x0007
#define PTP_V2_TLV_TYPE_PATH_TRACE 0x0008
#define PTP_V2_TLV_TYPE_ALTERNATE_TIME_OFFSET_INDICATOR 0x0009
#define PTP_V2_TLV_TYPE_AUTHENTICATION 0x2000
#define PTP_V2_TLV_TYPE_AUTHENTICATION_CHALLENGE 0x2001
#define PTP_V2_TLV_TYPE_SECURITY_ASSOCIATION_UPDATE 0x2002
#define PTP_V2_TLV_TYPE_CUM_FREQ_SCALE_FACTOR_OFFSET 0x2003
/* Signalling TLV Object IDs */
#define PTP_AS_TLV_OID_TYPE_802 0x0080C2
/* PTPv2 Management clockType Boolean[16] Bits mask */
#define CLOCKTYPE_ORDINARY_CLOCK 0x8000
#define CLOCKTYPE_BOUNDARY_CLOCK 0x4000
#define CLOCKTYPE_P2P_TC 0x2000
#define CLOCKTYPE_E2E_TC 0x1000
#define CLOCKTYPE_MANAGEMENT_NODE 0x0800
#define CLOCKTYPE_RESERVED 0x07FF
/* PTPv2 Management IDs */
#define PTP_V2_MM_ID_NULL_MANAGEMENT 0x0000
#define PTP_V2_MM_ID_CLOCK_DESCRIPTION 0x0001
#define PTP_V2_MM_ID_USER_DESCRIPTION 0x0002
#define PTP_V2_MM_ID_SAVE_IN_NON_VOLATILE_STORAGE 0x0003
#define PTP_V2_MM_ID_RESET_NON_VOLATILE_STORAGE 0x0004
#define PTP_V2_MM_ID_INITIALIZE 0x0005
#define PTP_V2_MM_ID_FAULT_LOG 0x0006
#define PTP_V2_MM_ID_FAULT_LOG_RESET 0x0007
#define PTP_V2_MM_ID_DEFAULT_DATA_SET 0x2000
#define PTP_V2_MM_ID_CURRENT_DATA_SET 0x2001
#define PTP_V2_MM_ID_PARENT_DATA_SET 0x2002
#define PTP_V2_MM_ID_TIME_PROPERTIES_DATA_SET 0x2003
#define PTP_V2_MM_ID_PORT_DATA_SET 0x2004
#define PTP_V2_MM_ID_PRIORITY1 0x2005
#define PTP_V2_MM_ID_PRIORITY2 0x2006
#define PTP_V2_MM_ID_DOMAIN 0x2007
#define PTP_V2_MM_ID_SLAVE_ONLY 0x2008
#define PTP_V2_MM_ID_LOG_ANNOUNCE_INTERVAL 0x2009
#define PTP_V2_MM_ID_ANNOUNCE_RECEIPT_TIMEOUT 0x200A
#define PTP_V2_MM_ID_LOG_SYNC_INTERVAL 0x200B
#define PTP_V2_MM_ID_VERSION_NUMBER 0x200C
#define PTP_V2_MM_ID_ENABLE_PORT 0x200D
#define PTP_V2_MM_ID_DISABLE_PORT 0x200E
#define PTP_V2_MM_ID_TIME 0x200F
#define PTP_V2_MM_ID_CLOCK_ACCURACY 0x2010
#define PTP_V2_MM_ID_UTC_PROPERTIES 0x2011
#define PTP_V2_MM_ID_TRACEABILITY_PROPERTIES 0x2012
#define PTP_V2_MM_ID_TIMESCALE_PROPERTIES 0x2013
#define PTP_V2_MM_ID_UNICAST_NEGOTIATION_ENABLE 0x2014
#define PTP_V2_MM_ID_PATH_TRACE_LIST 0x2015
#define PTP_V2_MM_ID_PATH_TRACE_ENABLE 0x2016
#define PTP_V2_MM_ID_GRANDMASTER_CLUSTER_TABLE 0x2017
#define PTP_V2_MM_ID_UNICAST_MASTER_TABLE 0x2018
#define PTP_V2_MM_ID_UNICAST_MASTER_MAX_TABLE_SIZE 0x2019
#define PTP_V2_MM_ID_ACCEPTABLE_MASTER_TABLE 0x201A
#define PTP_V2_MM_ID_ACCEPTABLE_MASTER_TABLE_ENABLED 0x201B
#define PTP_V2_MM_ID_ACCEPTABLE_MASTER_MAX_TABLE_SIZE 0x201C
#define PTP_V2_MM_ID_ALTERNATE_MASTER 0x201D
#define PTP_V2_MM_ID_ALTERNATE_TIME_OFFSET_ENABLE 0x201E
#define PTP_V2_MM_ID_ALTERNATE_TIME_OFFSET_NAME 0x201F
#define PTP_V2_MM_ID_ALTERNATE_TIME_OFFSET_MAX_KEY 0x2020
#define PTP_V2_MM_ID_ALTERNATE_TIME_OFFSET_PROPERTIES 0x2021
#define PTP_V2_MM_ID_TC_DEFAULT_DATA_SET 0x4000
#define PTP_V2_MM_ID_TC_PORT_DATA_SET 0x4001
#define PTP_V2_MM_ID_PRIMARY_DOMAIN 0x4002
#define PTP_V2_MM_ID_DELAY_MECHANISM 0x6000
#define PTP_V2_MM_ID_LOG_MIN_PDELAY_REQ_INTERVAL 0x6001
/* Management DataField for DefaultDS */
#define PTP_V2_MM_RESERVED1 PTP_V2_MM_TLV_DATAFIELD_OFFSET + 1
#define PTP_V2_MM_NUMBERPORTS PTP_V2_MM_TLV_DATAFIELD_OFFSET + 2
#define PTP_V2_MM_PRIORITY1 PTP_V2_MM_TLV_DATAFIELD_OFFSET + 4
#define PTP_V2_MM_CLOCKQUALITY PTP_V2_MM_TLV_DATAFIELD_OFFSET + 5
#define PTP_V2_MM_PRIORITY2 PTP_V2_MM_TLV_DATAFIELD_OFFSET + 9
#define PTP_V2_MM_CLOCKIDENTITY PTP_V2_MM_TLV_DATAFIELD_OFFSET + 10
#define PTP_V2_MM_DOMAINNUMBER PTP_V2_MM_TLV_DATAFIELD_OFFSET + 18
#define PTP_V2_MM_RESERVED2 PTP_V2_MM_TLV_DATAFIELD_OFFSET + 19
/* Organization IDs for PTPv2 Organization Extension */
#define PTP_V2_OE_ORG_ID_IEEE_C37_238 0x1C129D /* Defined in IEEE Std C37.238-2011 */
#define PTP_v2_OE_ORG_ID_SMPTE 0x6897E8 /* Society of Motion Picture and Television Engineers */
/* Subtypes for the PTP_V2_OE_ORG_ID_IEEE_C37_238 organization ID */
#define PTP_V2_OE_ORG_IEEE_C37_238_SUBTYPE_C37238TLV 1 /* Defined in IEEE Std C37.238-2011 */
/* Subtypes for the PTP_V2_OE_ORG_ID_SMPTE organization ID */
#define PTP_V2_OE_ORG_SMPTE_SUBTYPE_VERSION_TLV 1
#define PTP_V2_TRANSPORTSPECIFIC_V1COMPATIBILITY_BITMASK 0x10
#define PTP_V2_TRANSPORTSPECIFIC_ASPACKET_BITMASK 0x10
/**********************************************************/
/* flag-field-mask-definitions */
/**********************************************************/
#define PTP_V2_FLAGS_LI61_BITMASK 0x0001
#define PTP_V2_FLAGS_LI59_BITMASK 0x0002
#define PTP_V2_FLAGS_UTC_OFFSET_VALID_BITMASK 0x0004
#define PTP_V2_FLAGS_PTP_TIMESCALE_BITMASK 0x0008
#define PTP_V2_FLAGS_TIME_TRACEABLE_BITMASK 0x0010
#define PTP_V2_FLAGS_FREQUENCY_TRACEABLE_BITMASK 0x0020
#define PTP_V2_FLAGS_ALTERNATE_BITMASK 0x0100
#define PTP_V2_FLAGS_TWO_STEP_BITMASK 0x0200
#define PTP_V2_FLAGS_UNICAST_BITMASK 0x0400
#define PTP_V2_FLAGS_SPECIFIC1_BITMASK 0x2000
#define PTP_V2_FLAGS_SPECIFIC2_BITMASK 0x4000
#define PTP_V2_FLAGS_SECURITY_BITMASK 0x8000
#define PTP_V2_FLAGS_OE_SMPTE_TIME_ADRESS_FIELD_DROP 0x01
#define PTP_V2_FLAGS_OE_SMPTE_TIME_ADRESS_FIELD_COLOR 0x02
#define PTP_V2_FLAGS_OE_SMPTE_DAYLIGHT_SAVING_CURRENT 0x01
#define PTP_V2_FLAGS_OE_SMPTE_DAYLIGHT_SAVING_NEXT 0x02
#define PTP_V2_FLAGS_OE_SMPTE_DAYLIGHT_SAVING_PREVIOUS 0x04
#define PTP_V2_FLAGS_OE_SMPTE_LEAP_SECOND_JUMP_CHANGE 0x01
/**********************************************************/
/* PTP v2 message ids (ptp messageid field) */
/**********************************************************/
#define PTP_V2_SYNC_MESSAGE 0x00
#define PTP_V2_DELAY_REQ_MESSAGE 0x01
#define PTP_V2_PATH_DELAY_REQ_MESSAGE 0x02
#define PTP_V2_PATH_DELAY_RESP_MESSAGE 0x03
#define PTP_V2_FOLLOWUP_MESSAGE 0x08
#define PTP_V2_DELAY_RESP_MESSAGE 0x09
#define PTP_V2_PATH_DELAY_FOLLOWUP_MESSAGE 0x0A
#define PTP_V2_ANNOUNCE_MESSAGE 0x0B
#define PTP_V2_SIGNALLING_MESSAGE 0x0C
#define PTP_V2_MANAGEMENT_MESSAGE 0x0D
static const value_string ptp_v2_managementID_vals[] = {
{PTP_V2_MM_ID_NULL_MANAGEMENT ,"NULL_MANAGEMENT"},
{PTP_V2_MM_ID_CLOCK_DESCRIPTION ,"CLOCK_DESCRIPTION"},
{PTP_V2_MM_ID_USER_DESCRIPTION ,"USER_DESCRIPTION"},
{PTP_V2_MM_ID_SAVE_IN_NON_VOLATILE_STORAGE ,"SAVE_IN_NON_VOLATILE_STORAGE"},
{PTP_V2_MM_ID_RESET_NON_VOLATILE_STORAGE ,"RESET_NON_VOLATILE_STORAGE"},
{PTP_V2_MM_ID_INITIALIZE ,"INITIALIZE"},
{PTP_V2_MM_ID_FAULT_LOG ,"FAULT_LOG"},
{PTP_V2_MM_ID_FAULT_LOG_RESET ,"FAULT_LOG_RESET"},
{PTP_V2_MM_ID_DEFAULT_DATA_SET ,"DEFAULT_DATA_SET"},
{PTP_V2_MM_ID_CURRENT_DATA_SET ,"CURRENT_DATA_SET"},
{PTP_V2_MM_ID_PARENT_DATA_SET ,"PARENT_DATA_SET"},
{PTP_V2_MM_ID_TIME_PROPERTIES_DATA_SET ,"TIME_PROPERTIES_DATA_SET"},
{PTP_V2_MM_ID_PORT_DATA_SET ,"PORT_DATA_SET"},
{PTP_V2_MM_ID_PRIORITY1 ,"PRIORITY1"},
{PTP_V2_MM_ID_PRIORITY2 ,"PRIORITY2"},
{PTP_V2_MM_ID_DOMAIN ,"DOMAIN"},
{PTP_V2_MM_ID_SLAVE_ONLY ,"SLAVE_ONLY"},
{PTP_V2_MM_ID_LOG_ANNOUNCE_INTERVAL ,"LOG_ANNOUNCE_INTERVAL"},
{PTP_V2_MM_ID_ANNOUNCE_RECEIPT_TIMEOUT ,"ANNOUNCE_RECEIPT_TIMEOUT"},
{PTP_V2_MM_ID_LOG_SYNC_INTERVAL ,"LOG_SYNC_INTERVAL"},
{PTP_V2_MM_ID_VERSION_NUMBER ,"VERSION_NUMBER"},
{PTP_V2_MM_ID_ENABLE_PORT ,"ENABLE_PORT"},
{PTP_V2_MM_ID_DISABLE_PORT ,"DISABLE_PORT"},
{PTP_V2_MM_ID_TIME ,"TIME"},
{PTP_V2_MM_ID_CLOCK_ACCURACY ,"CLOCK_ACCURACY"},
{PTP_V2_MM_ID_UTC_PROPERTIES ,"UTC_PROPERTIES"},
{PTP_V2_MM_ID_TRACEABILITY_PROPERTIES ,"TRACEABILITY_PROPERTIES"},
{PTP_V2_MM_ID_TIMESCALE_PROPERTIES ,"TIMESCALE_PROPERTIES"},
{PTP_V2_MM_ID_UNICAST_NEGOTIATION_ENABLE ,"UNICAST_NEGOTIATION_ENABLE"},
{PTP_V2_MM_ID_PATH_TRACE_LIST ,"PATH_TRACE_LIST"},
{PTP_V2_MM_ID_PATH_TRACE_ENABLE ,"PATH_TRACE_ENABLE"},
{PTP_V2_MM_ID_GRANDMASTER_CLUSTER_TABLE ,"GRANDMASTER_CLUSTER_TABLE"},
{PTP_V2_MM_ID_UNICAST_MASTER_TABLE ,"UNICAST_MASTER_TABLE"},
{PTP_V2_MM_ID_UNICAST_MASTER_MAX_TABLE_SIZE ,"UNICAST_MASTER_MAX_TABLE_SIZE"},
{PTP_V2_MM_ID_ACCEPTABLE_MASTER_TABLE ,"ACCEPTABLE_MASTER_TABLE"},
{PTP_V2_MM_ID_ACCEPTABLE_MASTER_TABLE_ENABLED ,"ACCEPTABLE_MASTER_TABLE_ENABLED"},
{PTP_V2_MM_ID_ACCEPTABLE_MASTER_MAX_TABLE_SIZE ,"ACCEPTABLE_MASTER_MAX_TABLE_SIZE"},
{PTP_V2_MM_ID_ALTERNATE_MASTER ,"ALTERNATE_MASTER"},
{PTP_V2_MM_ID_ALTERNATE_TIME_OFFSET_ENABLE ,"ALTERNATE_TIME_OFFSET_ENABLE"},
{PTP_V2_MM_ID_ALTERNATE_TIME_OFFSET_NAME ,"ALTERNATE_TIME_OFFSET_NAME"},
{PTP_V2_MM_ID_ALTERNATE_TIME_OFFSET_MAX_KEY ,"ALTERNATE_TIME_OFFSET_MAX_KEY"},
{PTP_V2_MM_ID_ALTERNATE_TIME_OFFSET_PROPERTIES ,"ALTERNATE_TIME_OFFSET_PROPERTIES"},
{PTP_V2_MM_ID_TC_DEFAULT_DATA_SET ,"TC_DEFAULT_DATA_SET"},
{PTP_V2_MM_ID_TC_PORT_DATA_SET ,"TC_PORT_DATA_SET"},
{PTP_V2_MM_ID_PRIMARY_DOMAIN ,"PRIMARY_DOMAIN"},
{PTP_V2_MM_ID_DELAY_MECHANISM ,"DELAY_MECHANISM"},
{PTP_V2_MM_ID_LOG_MIN_PDELAY_REQ_INTERVAL ,"LOG_MIN_PDELAY_REQ_INTERVAL"},
{0 ,NULL}
};
static value_string_ext ptp_v2_managementID_vals_ext =
VALUE_STRING_EXT_INIT(ptp_v2_managementID_vals);
/* same again but better readable text for info column */
static const value_string ptp_v2_managementID_infocolumn_vals[] = {
{PTP_V2_MM_ID_NULL_MANAGEMENT ,"Null management"},
{PTP_V2_MM_ID_CLOCK_DESCRIPTION ,"Clock description"},
{PTP_V2_MM_ID_USER_DESCRIPTION ,"User description"},
{PTP_V2_MM_ID_SAVE_IN_NON_VOLATILE_STORAGE ,"Save in non volatile storage"},
{PTP_V2_MM_ID_RESET_NON_VOLATILE_STORAGE ,"Reset non volatile storage"},
{PTP_V2_MM_ID_INITIALIZE ,"Initialize"},
{PTP_V2_MM_ID_FAULT_LOG ,"Fault log"},
{PTP_V2_MM_ID_FAULT_LOG_RESET ,"Fault log reset"},
{PTP_V2_MM_ID_DEFAULT_DATA_SET ,"Default dataset"},
{PTP_V2_MM_ID_CURRENT_DATA_SET ,"Current dataset"},
{PTP_V2_MM_ID_PARENT_DATA_SET ,"Parent dataset"},
{PTP_V2_MM_ID_TIME_PROPERTIES_DATA_SET ,"Time properties dataset"},
{PTP_V2_MM_ID_PORT_DATA_SET ,"Port dataset"},
{PTP_V2_MM_ID_PRIORITY1 ,"Priority 1"},
{PTP_V2_MM_ID_PRIORITY2 ,"Priority 2"},
{PTP_V2_MM_ID_DOMAIN ,"Domain"},
{PTP_V2_MM_ID_SLAVE_ONLY ,"Slave only"},
{PTP_V2_MM_ID_LOG_ANNOUNCE_INTERVAL ,"Log announce interval"},
{PTP_V2_MM_ID_ANNOUNCE_RECEIPT_TIMEOUT ,"Announce receipt timeout"},
{PTP_V2_MM_ID_LOG_SYNC_INTERVAL ,"Log sync interval"},
{PTP_V2_MM_ID_VERSION_NUMBER ,"Version number"},
{PTP_V2_MM_ID_ENABLE_PORT ,"Enable port"},
{PTP_V2_MM_ID_DISABLE_PORT ,"Disable port"},
{PTP_V2_MM_ID_TIME ,"Time"},
{PTP_V2_MM_ID_CLOCK_ACCURACY ,"Clock accuracy"},
{PTP_V2_MM_ID_UTC_PROPERTIES ,"UTC properties"},
{PTP_V2_MM_ID_TRACEABILITY_PROPERTIES ,"Traceability properties"},
{PTP_V2_MM_ID_TIMESCALE_PROPERTIES ,"Timescale properties"},
{PTP_V2_MM_ID_UNICAST_NEGOTIATION_ENABLE ,"Unicast negotiation enable"},
{PTP_V2_MM_ID_PATH_TRACE_LIST ,"Path trace list"},
{PTP_V2_MM_ID_PATH_TRACE_ENABLE ,"Path trace enable"},
{PTP_V2_MM_ID_GRANDMASTER_CLUSTER_TABLE ,"Grandmaster cluster table"},
{PTP_V2_MM_ID_UNICAST_MASTER_TABLE ,"Unicast master table"},
{PTP_V2_MM_ID_UNICAST_MASTER_MAX_TABLE_SIZE ,"Unicast master max table size"},
{PTP_V2_MM_ID_ACCEPTABLE_MASTER_TABLE ,"Acceptable master table"},
{PTP_V2_MM_ID_ACCEPTABLE_MASTER_TABLE_ENABLED ,"Acceptable master table enabled"},
{PTP_V2_MM_ID_ACCEPTABLE_MASTER_MAX_TABLE_SIZE ,"Acceptable master max table size"},
{PTP_V2_MM_ID_ALTERNATE_MASTER ,"Alternate master"},
{PTP_V2_MM_ID_ALTERNATE_TIME_OFFSET_ENABLE ,"Alternate time offset enable"},
{PTP_V2_MM_ID_ALTERNATE_TIME_OFFSET_NAME ,"Alternate time offset name"},
{PTP_V2_MM_ID_ALTERNATE_TIME_OFFSET_MAX_KEY ,"Alternate time offset max key"},
{PTP_V2_MM_ID_ALTERNATE_TIME_OFFSET_PROPERTIES ,"Alternate time offset properties"},
{PTP_V2_MM_ID_TC_DEFAULT_DATA_SET ,"Transparent clock default dataset"},
{PTP_V2_MM_ID_TC_PORT_DATA_SET ,"Transparent clock port dataset"},
{PTP_V2_MM_ID_PRIMARY_DOMAIN ,"Primary domain"},
{PTP_V2_MM_ID_DELAY_MECHANISM ,"Delay mechanism"},
{PTP_V2_MM_ID_LOG_MIN_PDELAY_REQ_INTERVAL ,"Log min pdelay req. interval"},
{0 , NULL}
};
static value_string_ext ptp_v2_managementID_infocolumn_vals_ext =
VALUE_STRING_EXT_INIT(ptp_v2_managementID_infocolumn_vals);
static const value_string ptp_v2_TLV_type_vals[] = {
{PTP_V2_TLV_TYPE_RESERVED ,"Reserved"},
{PTP_V2_TLV_TYPE_MANAGEMENT ,"Management"},
{PTP_V2_TLV_TYPE_MANAGEMENT_ERROR_STATUS ,"Management error status"},
{PTP_V2_TLV_TYPE_ORGANIZATION_EXTENSION ,"Organization extension"},
{PTP_V2_TLV_TYPE_REQUEST_UNICAST_TRANSMISSION ,"Request unicast transmission"},
{PTP_V2_TLV_TYPE_GRANT_UNICAST_TRANSMISSION ,"Grant unicast transmission"},
{PTP_V2_TLV_TYPE_CANCEL_UNICAST_TRANSMISSION ,"Cancel unicast transmission"},
{PTP_V2_TLV_TYPE_ACKNOWLEDGE_CANCEL_UNICAST_TRANSMISSION ,"Acknowledge cancel unicast transmission"},
{PTP_V2_TLV_TYPE_PATH_TRACE ,"Path trace"},
{PTP_V2_TLV_TYPE_ALTERNATE_TIME_OFFSET_INDICATOR,"Alternate time offset indicator"},
{PTP_V2_TLV_TYPE_AUTHENTICATION ,"Authentication"},
{PTP_V2_TLV_TYPE_AUTHENTICATION_CHALLENGE ,"Authentication challenge"},
{PTP_V2_TLV_TYPE_SECURITY_ASSOCIATION_UPDATE ,"Security association update"},
{PTP_V2_TLV_TYPE_CUM_FREQ_SCALE_FACTOR_OFFSET ,"Cum. freq. scale factor offset"},
{0 , NULL}
};
static value_string_ext ptp_v2_TLV_type_vals_ext =
VALUE_STRING_EXT_INIT(ptp_v2_TLV_type_vals);
static const value_string ptp_as_TLV_oid_vals[] = {
{PTP_AS_TLV_OID_TYPE_802 ,"IEEE 802"},
{0 , NULL}
};
static const value_string ptp_v2_networkProtocol_vals[] = {
{0x0000, "Reserved"},
{0x0001, "UDP/IPv4"},
{0x0002, "UDP/IPv6"},
{0x0003, "IEEE 802.3"},
{0x0004, "DeviceNet"},
{0x0005, "ControlNet"},
{0x0006, "PROFINET"},
{0x0007, "Reserved"},
{0xFFFE, "Unknown Protocol"},
{0xFFFF, "Reserved"},
{0, NULL }
};
/* Exposed in packet-ptp.h */
value_string_ext ptp_v2_networkProtocol_vals_ext =
VALUE_STRING_EXT_INIT(ptp_v2_networkProtocol_vals);
static const value_string ptp_v2_messageid_vals[] = {
{PTP_V2_SYNC_MESSAGE, "Sync Message"},
{PTP_V2_DELAY_REQ_MESSAGE, "Delay_Req Message"},
{PTP_V2_PATH_DELAY_REQ_MESSAGE, "Path_Delay_Req Message"},
{PTP_V2_PATH_DELAY_RESP_MESSAGE, "Path_Delay_Resp Message"},
{PTP_V2_FOLLOWUP_MESSAGE, "Follow_Up Message"},
{PTP_V2_DELAY_RESP_MESSAGE, "Delay_Resp Message"},
{PTP_V2_PATH_DELAY_FOLLOWUP_MESSAGE,"Path_Delay_Resp_Follow_Up Message"},
{PTP_V2_ANNOUNCE_MESSAGE, "Announce Message"},
{PTP_V2_SIGNALLING_MESSAGE, "Signalling Message"},
{PTP_V2_MANAGEMENT_MESSAGE, "Management Message"},
{0, NULL }
};
static value_string_ext ptp_v2_messageid_vals_ext =
VALUE_STRING_EXT_INIT(ptp_v2_messageid_vals);
static const value_string ptp_v2_clockAccuracy_vals[] = {
{0x20, "The time is accurate to within 25 ns"},
{0x21, "The time is accurate to within 100 ns"},
{0x22, "The time is accurate to within 250 ns"},
{0x23, "The time is accurate to within 1 us"},
{0x24, "The time is accurate to within 2,5 us"},
{0x25, "The time is accurate to within 10 us"},
{0x26, "The time is accurate to within 25 us"},
{0x27, "The time is accurate to within 100 us"},
{0x28, "The time is accurate to within 250 us"},
{0x29, "The time is accurate to within 1 ms"},
{0x2A, "The time is accurate to within 2,5 ms"},
{0x2B, "The time is accurate to within 10 ms"},
{0x2C, "The time is accurate to within 25 ms"},
{0x2D, "The time is accurate to within 100 ms"},
{0x2E, "The time is accurate to within 250 ms"},
{0x2F, "The time is accurate to within 1 s"},
{0x30, "The time is accurate to within 10 s"},
{0x31, "The time is accurate to >10 s"},
{0x32, "reserved"},
{0x80, "For use by alternate PTP profiles"},
{0xFE, "Accuracy Unknown"},
{0xFF, "reserved"},
{0, NULL }
};
/* Exposed in packet-ptp.h */
value_string_ext ptp_v2_clockAccuracy_vals_ext =
VALUE_STRING_EXT_INIT(ptp_v2_clockAccuracy_vals);
static const value_string ptp_v2_timeSource_vals[] = {
{0x10, "ATOMIC_CLOCK"},
{0x20, "GPS"},
{0x30, "TERRESTRIAL_RADIO"},
{0x40, "PTP"},
{0x50, "NTP"},
{0x60, "HAND_SET"},
{0x90, "OTHER"},
{0xA0, "INTERNAL_OSCILLATOR"},
{0xFF, "reserved"},
{0, NULL }
};
/* Exposed in packet-ptp.h */
value_string_ext ptp_v2_timeSource_vals_ext =
VALUE_STRING_EXT_INIT(ptp_v2_timeSource_vals);
static const value_string ptp_v2_mm_action_vals[] = {
{0x0, "GET"},
{0x1, "SET"},
{0x2, "RESPONSE"},
{0x3, "COMMAND"},
{0x4, "ACKNOWLEDGE"},
{0, NULL }
};
static const value_string ptp_v2_severityCode_vals[] = {
{0x00, "Emergency: system is unusable"},
{0x01, "Alert: immediate action needed"},
{0x02, "Critical: critical conditions"},
{0x03, "Error: error conditions"},
{0x04, "Warning: warning conditions"},
{0x05, "Notice: normal but significant condition"},
{0x06, "Informational: informational messages"},
{0x07, "Debug: debug-level messages"},
{0x08, "Reserved"},
{0xFF, "Reserved"},
{0, NULL}
};
static value_string_ext ptp_v2_severityCode_vals_ext =
VALUE_STRING_EXT_INIT(ptp_v2_severityCode_vals);
static const value_string ptp_v2_portState_vals[] = {
{0x01, "INITIALIZING"},
{0x02, "FAULTY"},
{0x03, "DISABLED"},
{0x04, "LISTENING"},
{0x05, "PRE_MASTER"},
{0x06, "MASTER"},
{0x07, "PASSIVE"},
{0x08, "UNCALIBRATED"},
{0x09, "SLAVE"},
{0, NULL}
};
/* Exposed in packet-ptp.h */
value_string_ext ptp_v2_portState_vals_ext =
VALUE_STRING_EXT_INIT(ptp_v2_portState_vals);
/* Exposed in packet-ptp.h */
const value_string ptp_v2_delayMechanism_vals[] = {
{0x01, "E2E"},
{0x02, "P2P"},
{0xFE, "DISABLED"},
{0, NULL}
};
static const value_string ptp_v2_managementErrorId_vals[] = {
{0x0000, "Reserved"},
{0x0001, "RESPONSE_TOO_BIG"},
{0x0002, "NO_SUCH_ID"},
{0x0003, "WRONG_LENGTH"},
{0x0004, "WRONG_VALUE"},
{0x0005, "NOT_SETABLE"},
{0x0006, "NOT_SUPPORTED"},
{0x0007, "Reserved"},
{0xFFFE, "GENERAL_ERROR"},
{0xFFFF, "Reserved"},
{0, NULL}
};
static value_string_ext ptp_v2_managementErrorId_vals_ext =
VALUE_STRING_EXT_INIT(ptp_v2_managementErrorId_vals);
static const value_string ptp_v2_organizationExtensionOrgId_vals[] = {
{PTP_V2_OE_ORG_ID_IEEE_C37_238, "IEEE C37.238"},
{PTP_v2_OE_ORG_ID_SMPTE, "Society of Motion Picture and Television Engineers"},
{0, NULL}
};
static const value_string ptp_v2_org_iee_c37_238_subtype_vals[] = {
{PTP_V2_OE_ORG_IEEE_C37_238_SUBTYPE_C37238TLV, "IEEE_C37_238 TLV"},
{0, NULL}
};
static const value_string ptp_v2_org_smpte_subtype_vals[] = {
{PTP_V2_OE_ORG_SMPTE_SUBTYPE_VERSION_TLV, "Version"},
{0, NULL}
};
static const value_string ptp_v2_org_smpte_subtype_masterlockingstatus_vals[] = {
{0, "Not in use"},
{1, "Free Run"},
{2, "Cold Locking"},
{3, "Warm Locking"},
{4, "Locked"},
{0, NULL}
};
/**********************************************************/
/* Initialize the protocol and registered fields */
/**********************************************************/
static int hf_ptp_v2_transportspecific = -1;
static int hf_ptp_v2_transportspecific_v1_compatibility = -1; /* over UDP */
static int hf_ptp_v2_transportspecific_802as_conform = -1; /* over Ethernet */
static int hf_ptp_v2_messageid = -1;
static int hf_ptp_v2_versionptp = -1;
static int hf_ptp_v2_messagelength = -1;
static int hf_ptp_v2_domainnumber = -1;
static int hf_ptp_v2_flags = -1;
static int hf_ptp_v2_flags_alternatemaster = -1;
static int hf_ptp_v2_flags_twostep = -1;
static int hf_ptp_v2_flags_unicast = -1;
static int hf_ptp_v2_flags_specific1 = -1;
static int hf_ptp_v2_flags_specific2 = -1;
static int hf_ptp_v2_flags_security = -1;
static int hf_ptp_v2_flags_li61 = -1;
static int hf_ptp_v2_flags_li59 = -1;
static int hf_ptp_v2_flags_utcoffsetvalid = -1;
static int hf_ptp_v2_flags_ptptimescale = -1;
static int hf_ptp_v2_flags_timetraceable = -1;
static int hf_ptp_v2_flags_frequencytraceable = -1;
static int hf_ptp_v2_correction = -1;
static int hf_ptp_v2_correctionsubns = -1;
static int hf_ptp_v2_clockidentity = -1;
static int hf_ptp_v2_sourceportid = -1;
static int hf_ptp_v2_sequenceid = -1;
static int hf_ptp_v2_control = -1;
static int hf_ptp_v2_logmessageperiod = -1;
/* Fields for PTP_Announce (=an) messages */
/* static int hf_ptp_v2_an_origintimestamp = -1; */ /* Field for seconds & nanoseconds */
static int hf_ptp_v2_an_origintimestamp_seconds = -1;
static int hf_ptp_v2_an_origintimestamp_nanoseconds = -1;
static int hf_ptp_v2_an_origincurrentutcoffset = -1;
static int hf_ptp_v2_an_timesource = -1;
static int hf_ptp_v2_an_localstepsremoved = -1;
static int hf_ptp_v2_an_grandmasterclockidentity = -1;
static int hf_ptp_v2_an_grandmasterclockclass = -1;
static int hf_ptp_v2_an_grandmasterclockaccuracy = -1;
static int hf_ptp_v2_an_grandmasterclockvariance = -1;
static int hf_ptp_v2_an_priority1 = -1;
static int hf_ptp_v2_an_priority2 = -1;
/* Fields for PTP_Announce TLVs */
static int hf_ptp_v2_an_tlv_tlvtype = -1;
static int hf_ptp_v2_an_tlv_lengthfield = -1;
/* Fields for the ORGANIZATION_EXTENSION TLV */
static int hf_ptp_v2_oe_tlv_organizationid = -1;
static int hf_ptp_v2_oe_tlv_organizationsubtype = -1;
static int hf_ptp_v2_oe_tlv_datafield = -1;
/* Fields for IEEE_C37_238 TLV (OE TLV subtype) */
static int hf_ptp_v2_oe_tlv_subtype_c37238tlv_grandmasterid = -1;
static int hf_ptp_v2_oe_tlv_subtype_c37238tlv_grandmastertimeinaccuracy = -1;
static int hf_ptp_v2_oe_tlv_subtype_c37238tlv_networktimeinaccuracy = -1;
static int hf_ptp_v2_oe_tlv_subtype_c37238tlv_reserved = -1;
/* Fields for SMPTE TLV (OE TLV subtype) */
static int hf_ptp_v2_oe_tlv_smpte_subtype = -1;
static int hf_ptp_v2_oe_tlv_subtype_smpte_data = -1;
static int hf_ptp_v2_oe_tlv_subtype_smpte_defaultsystemframerate = -1;
static int hf_ptp_v2_oe_tlv_subtype_smpte_defaultsystemframerate_numerator = -1;
static int hf_ptp_v2_oe_tlv_subtype_smpte_defaultsystemframerate_denominator = -1;
static int hf_ptp_v2_oe_tlv_subtype_smpte_masterlockingstatus = -1;
static int hf_ptp_v2_oe_tlv_subtype_smpte_timeaddressflags = -1;
static int hf_ptp_v2_oe_tlv_subtype_smpte_timeaddressflags_drop = -1;
static int hf_ptp_v2_oe_tlv_subtype_smpte_timeaddressflags_color = -1;
static int hf_ptp_v2_oe_tlv_subtype_smpte_currentlocaloffset = -1;
static int hf_ptp_v2_oe_tlv_subtype_smpte_jumpseconds = -1;
static int hf_ptp_v2_oe_tlv_subtype_smpte_timeofnextjump = -1;
static int hf_ptp_v2_oe_tlv_subtype_smpte_timeofnextjam = -1;
static int hf_ptp_v2_oe_tlv_subtype_smpte_timeofpreviousjam = -1;
static int hf_ptp_v2_oe_tlv_subtype_smpte_previousjamlocaloffset = -1;
static int hf_ptp_v2_oe_tlv_subtype_smpte_daylightsaving = -1;
static int hf_ptp_v2_oe_tlv_subtype_smpte_daylightsaving_current = -1;
static int hf_ptp_v2_oe_tlv_subtype_smpte_daylightsaving_next = -1;
static int hf_ptp_v2_oe_tlv_subtype_smpte_daylightsaving_previous = -1;
static int hf_ptp_v2_oe_tlv_subtype_smpte_leapsecondjump = -1;
static int hf_ptp_v2_oe_tlv_subtype_smpte_leapsecondjump_change = -1;
/* Fields for the ALTERNATE_TIME_OFFSET_INDICATOR TLV */
static int hf_ptp_v2_atoi_tlv_keyfield = -1;
static int hf_ptp_v2_atoi_tlv_currentoffset = -1;
static int hf_ptp_v2_atoi_tlv_jumpseconds = -1;
static int hf_ptp_v2_atoi_tlv_timeofnextjump = -1;
static int hf_ptp_v2_atoi_tlv_displayname = -1;
static int hf_ptp_v2_atoi_tlv_displayname_length = -1;
/* Field for the PATH TRACE TLV */
static int hf_ptp_v2_an_tlv_pathsequence = -1;
/* Fields for an undissected TLV */
static int hf_ptp_v2_an_tlv_data = -1;
/* Fields for PTP_Sync AND PTP_DelayRequest (=sdr) messages */
/* static int hf_ptp_v2_sdr_origintimestamp = -1; */ /* Field for seconds & nanoseconds */
static int hf_ptp_v2_sdr_origintimestamp_seconds = -1;
static int hf_ptp_v2_sdr_origintimestamp_nanoseconds = -1;
/* Fields for PTP_Follow_Up (=fu) messages */
/* static int hf_ptp_v2_fu_preciseorigintimestamp = -1; */ /* Field for seconds & nanoseconds */
static int hf_ptp_v2_fu_preciseorigintimestamp_seconds = -1;
static int hf_ptp_v2_fu_preciseorigintimestamp_nanoseconds = -1;
/* Fields for the Follow_Up Information TLV */
static int hf_ptp_as_fu_tlv_tlvtype = -1;
static int hf_ptp_as_fu_tlv_lengthfield = -1;
static int hf_ptp_as_fu_tlv_organization_id = -1;
static int hf_ptp_as_fu_tlv_organization_subtype = -1;
static int hf_ptp_as_fu_tlv_cumulative_offset = -1;
static int hf_ptp_as_fu_tlv_gm_base_indicator = -1;
static int hf_ptp_as_fu_tlv_last_gm_phase_change = -1;
static int hf_ptp_as_fu_tlv_scaled_last_gm_freq_change = -1;
/* Fields for PTP_DelayResponse (=dr) messages */
/* static int hf_ptp_v2_dr_receivetimestamp = -1; */ /* Field for seconds & nanoseconds */
static int hf_ptp_v2_dr_receivetimestamp_seconds = -1;
static int hf_ptp_v2_dr_receivetimestamp_nanoseconds = -1;
static int hf_ptp_v2_dr_requestingportidentity = -1;
static int hf_ptp_v2_dr_requestingsourceportid = -1;
/* Fields for PTP_PDelayRequest (=pdrq) messages */
/* static int hf_ptp_v2_pdrq_origintimestamp = -1; */ /* Field for seconds & nanoseconds */
static int hf_ptp_v2_pdrq_origintimestamp_seconds = -1;
static int hf_ptp_v2_pdrq_origintimestamp_nanoseconds = -1;
/* Fields for PTP_PDelayResponse (=pdrs) messages */
/* static int hf_ptp_v2_pdrs_requestreceipttimestamp = -1; */ /* Field for seconds & nanoseconds */
static int hf_ptp_v2_pdrs_requestreceipttimestamp_seconds = -1;
static int hf_ptp_v2_pdrs_requestreceipttimestamp_nanoseconds = -1;
static int hf_ptp_v2_pdrs_requestingportidentity = -1;
static int hf_ptp_v2_pdrs_requestingsourceportid = -1;
/* Fields for PTP_PDelayResponseFollowUp (=pdfu) messages */
/* static int hf_ptp_v2_pdfu_responseorigintimestamp = -1; */ /* Field for seconds & nanoseconds */
static int hf_ptp_v2_pdfu_responseorigintimestamp_seconds = -1;
static int hf_ptp_v2_pdfu_responseorigintimestamp_nanoseconds = -1;
static int hf_ptp_v2_pdfu_requestingportidentity = -1;
static int hf_ptp_v2_pdfu_requestingsourceportid = -1;
/* Fields for PTP_Signalling (=sig) messages */
static int hf_ptp_v2_sig_targetportidentity = -1;
static int hf_ptp_v2_sig_targetportid = -1;
static int hf_ptp_v2_sig_tlv_tlvType = -1;
static int hf_ptp_v2_sig_tlv_lengthField = -1;
static int hf_ptp_v2_sig_tlv_data = -1;
static int hf_ptp_v2_sig_tlv_messageType = -1;
static int hf_ptp_v2_sig_tlv_logInterMessagePeriod = -1;
static int hf_ptp_v2_sig_tlv_logInterMessagePeriod_period = -1;
static int hf_ptp_v2_sig_tlv_logInterMessagePeriod_rate = -1;
static int hf_ptp_v2_sig_tlv_durationField = -1;
static int hf_ptp_v2_sig_tlv_renewalInvited = -1;
/* Fields for the Message Interval Request TLV */
static int hf_ptp_as_sig_tlv_tlvtype = -1;
static int hf_ptp_as_sig_tlv_lengthfield = -1;
static int hf_ptp_as_sig_tlv_organization_id = -1;
static int hf_ptp_as_sig_tlv_organization_subtype = -1;
static int hf_ptp_as_sig_tlv_link_delay_interval = -1;
static int hf_ptp_as_sig_tlv_time_sync_interval = -1;
static int hf_ptp_as_sig_tlv_announce_interval = -1;
static int hf_ptp_as_sig_tlv_flags = -1;
static int hf_ptp_as_sig_tlv_flags_comp_rate_ratio = -1;
static int hf_ptp_as_sig_tlv_flags_comp_prop_delay = -1;
/* Fields for PTP_Management (=mm) messages */
static int hf_ptp_v2_mm_targetportidentity = -1;
static int hf_ptp_v2_mm_targetportid = -1;
static int hf_ptp_v2_mm_startingboundaryhops = -1;
static int hf_ptp_v2_mm_boundaryhops = -1;
static int hf_ptp_v2_mm_action = -1;
/* management TLV */
static int hf_ptp_v2_mm_tlvType = -1;
static int hf_ptp_v2_mm_lengthField = -1;
static int hf_ptp_v2_mm_managementId = -1;
static int hf_ptp_v2_mm_data = -1;
/* Management dataField */
static int hf_ptp_v2_mm_clockType = -1;
static int hf_ptp_v2_mm_clockType_ordinaryClock = -1;
static int hf_ptp_v2_mm_clockType_boundaryClock = -1;
static int hf_ptp_v2_mm_clockType_p2p_transparentClock = -1;
static int hf_ptp_v2_mm_clockType_e2e_transparentClock = -1;
static int hf_ptp_v2_mm_clockType_managementNode = -1;
static int hf_ptp_v2_mm_clockType_reserved = -1;
static int hf_ptp_v2_mm_physicalLayerProtocol = -1;
static int hf_ptp_v2_mm_physicalLayerProtocol_length = -1;
static int hf_ptp_v2_mm_physicalAddressLength = -1;
static int hf_ptp_v2_mm_physicalAddress = -1;
static int hf_ptp_v2_mm_protocolAddress = -1;
static int hf_ptp_v2_mm_protocolAddress_networkProtocol = -1;
static int hf_ptp_v2_mm_protocolAddress_length = -1;
static int hf_ptp_v2_mm_manufacturerIdentity = -1;
static int hf_ptp_v2_mm_reserved = -1;
static int hf_ptp_v2_mm_productDescription = -1;
static int hf_ptp_v2_mm_productDescription_length = -1;
static int hf_ptp_v2_mm_revisionData = -1;
static int hf_ptp_v2_mm_revisionData_length = -1;
static int hf_ptp_v2_mm_userDescription = -1;
static int hf_ptp_v2_mm_userDescription_length = -1;
static int hf_ptp_v2_mm_profileIdentity = -1;
static int hf_ptp_v2_mm_pad = -1;
static int hf_ptp_v2_mm_numberOfFaultRecords = -1;
/* static int hf_ptp_v2_mm_faultRecord = -1; */
static int hf_ptp_v2_mm_initializationKey = -1;
static int hf_ptp_v2_mm_severityCode = -1;
static int hf_ptp_v2_mm_faultRecordLength = -1;
/* static int hf_ptp_v2_mm_faultTime = -1; */
static int hf_ptp_v2_mm_faultTime_s = -1;
static int hf_ptp_v2_mm_faultTime_ns = -1;
static int hf_ptp_v2_mm_faultValue = -1;
static int hf_ptp_v2_mm_faultName = -1;
static int hf_ptp_v2_mm_faultName_length = -1;
static int hf_ptp_v2_mm_faultValue_length = -1;
static int hf_ptp_v2_mm_faultDescription = -1;
static int hf_ptp_v2_mm_faultDescription_length = -1;
static int hf_ptp_v2_mm_currentTime_s = -1;
static int hf_ptp_v2_mm_currentTime_ns = -1;
static int hf_ptp_v2_mm_clockAccuracy = -1;
static int hf_ptp_v2_mm_priority1 = -1;
static int hf_ptp_v2_mm_priority2 = -1;
static int hf_ptp_v2_mm_dds_SO = -1;
static int hf_ptp_v2_mm_TSC = -1;
static int hf_ptp_v2_mm_numberPorts = -1;
static int hf_ptp_v2_mm_clockclass = -1;
static int hf_ptp_v2_mm_clockaccuracy = -1;
static int hf_ptp_v2_mm_clockvariance = -1;
static int hf_ptp_v2_mm_clockidentity = -1;
static int hf_ptp_v2_mm_domainNumber = -1;
static int hf_ptp_v2_mm_SO = -1;
static int hf_ptp_v2_mm_stepsRemoved = -1;
static int hf_ptp_v2_mm_parentIdentity = -1;
static int hf_ptp_v2_mm_parentPort = -1;
static int hf_ptp_v2_mm_parentStats = -1;
static int hf_ptp_v2_mm_observedParentOffsetScaledLogVariance = -1;
static int hf_ptp_v2_mm_observedParentClockPhaseChangeRate = -1;
static int hf_ptp_v2_mm_grandmasterPriority1 = -1;
static int hf_ptp_v2_mm_grandmasterPriority2 = -1;
static int hf_ptp_v2_mm_grandmasterclockclass = -1;
static int hf_ptp_v2_mm_grandmasterclockaccuracy = -1;
static int hf_ptp_v2_mm_grandmasterclockvariance = -1;
static int hf_ptp_v2_mm_grandmasterIdentity = -1;
static int hf_ptp_v2_mm_currentUtcOffset = -1;
static int hf_ptp_v2_mm_LI_61 = -1;
static int hf_ptp_v2_mm_LI_59 = -1;
static int hf_ptp_v2_mm_UTCV = -1;
static int hf_ptp_v2_mm_PTP = -1;
static int hf_ptp_v2_mm_TTRA = -1;
static int hf_ptp_v2_mm_FTRA = -1;
static int hf_ptp_v2_mm_timesource = -1;
static int hf_ptp_v2_mm_offset_ns = -1;
static int hf_ptp_v2_mm_pathDelay_ns = -1;
static int hf_ptp_v2_mm_offset_subns = -1;
static int hf_ptp_v2_mm_pathDelay_subns = -1;
static int hf_ptp_v2_mm_PortNumber = -1;
static int hf_ptp_v2_mm_portState = -1;
static int hf_ptp_v2_mm_logMinDelayReqInterval = -1;
static int hf_ptp_v2_mm_peerMeanPathDelay_ns = -1;
static int hf_ptp_v2_mm_peerMeanPathDelay_subns = -1;
static int hf_ptp_v2_mm_logAnnounceInterval = -1;
static int hf_ptp_v2_mm_announceReceiptTimeout = -1;
static int hf_ptp_v2_mm_logSyncInterval = -1;
static int hf_ptp_v2_mm_delayMechanism = -1;
static int hf_ptp_v2_mm_logMinPdelayReqInterval = -1;
static int hf_ptp_v2_mm_versionNumber = -1;
static int hf_ptp_v2_mm_primaryDomain = -1;
static int hf_ptp_v2_mm_faultyFlag = -1;
static int hf_ptp_v2_mm_managementErrorId = -1;
static int hf_ptp_v2_mm_displayData = -1;
static int hf_ptp_v2_mm_displayData_length = -1;
static int hf_ptp_v2_mm_ucEN = -1;
static int hf_ptp_v2_mm_ptEN = -1;
static int hf_ptp_v2_mm_atEN = -1;
static int hf_ptp_v2_mm_keyField = -1;
static int hf_ptp_v2_mm_displayName = -1;
static int hf_ptp_v2_mm_displayName_length = -1;
static int hf_ptp_v2_mm_maxKey = -1;
static int hf_ptp_v2_mm_currentOffset = -1;
static int hf_ptp_v2_mm_jumpSeconds = -1;
static int hf_ptp_v2_mm_nextjumpSeconds = -1;
static int hf_ptp_v2_mm_logAlternateMulticastSyncInterval = -1;
static int hf_ptp_v2_mm_numberOfAlternateMasters = -1;
static int hf_ptp_v2_mm_transmitAlternateMulticastSync = -1;
/* Initialize the subtree pointers */
static gint ett_ptp_v2 = -1;
static gint ett_ptp_v2_flags = -1;
static gint ett_ptp_v2_correction = -1;
static gint ett_ptp_v2_time = -1;
static gint ett_ptp_v2_time2 = -1;
static gint ett_ptp_v2_managementData = -1;
static gint ett_ptp_v2_clockType = -1;
static gint ett_ptp_v2_physicalLayerProtocol = -1;
static gint ett_ptp_v2_protocolAddress = -1;
static gint ett_ptp_v2_faultRecord = -1;
static gint ett_ptp_v2_ptptext = -1;
static gint ett_ptp_v2_timeInterval = -1;
static gint ett_ptp_v2_tlv = -1;
static gint ett_ptp_v2_tlv_log_period = -1;
static gint ett_ptp_as_sig_tlv_flags = -1;
static gint ett_ptp_oe_smpte_data = -1;
static gint ett_ptp_oe_smpte_framerate = -1;
static gint ett_ptp_oe_smpte_timeaddress = -1;
static gint ett_ptp_oe_smpte_daylightsaving = -1;
static gint ett_ptp_oe_smpte_leapsecondjump = -1;
/* static gint ett_ptp_v2_timesource = -1;
static gint ett_ptp_v2_priority = -1; */
static gint ett_ptp_v2_transportspecific = -1;
static expert_field ei_ptp_v2_msg_len_too_large = EI_INIT;
static expert_field ei_ptp_v2_msg_len_too_small = EI_INIT;
/* END Definitions and fields for PTPv2 dissection. */
/* forward declaration of local functions for v1 and v2 */
static int
is_ptp_v1(tvbuff_t *tvb);
static void
dissect_ptp_v1(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
static gboolean
is_ptp_v2(tvbuff_t *tvb);
static void
dissect_ptp_v2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboolean ptpv2_oE);
/**********************************************************/
/* Implementation of the functions */
/**********************************************************/
/* Code to dissect the packet */
static int
dissect_ptp_oE(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
{
/* PTP over Ethernet only available with PTPv2 */
dissect_ptp_v2(tvb, pinfo, tree, TRUE);
return tvb_captured_length(tvb);
}
static int
dissect_ptp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
{
if(is_ptp_v1(tvb))
dissect_ptp_v1(tvb, pinfo, tree);
else if(is_ptp_v2(tvb))
dissect_ptp_v2(tvb, pinfo, tree, FALSE);
return tvb_captured_length(tvb);
}
/* Code to check if packet is PTPv1 */
static gboolean
is_ptp_v1(tvbuff_t *tvb)
{
guint16 version_ptp;
version_ptp = tvb_get_ntohs(tvb, PTP_VERSIONPTP_OFFSET);
if( version_ptp == 1) return TRUE;
else return FALSE;
}
/* Code to check if packet is PTPv2 */
static gboolean
is_ptp_v2(tvbuff_t *tvb)
{
guint8 version_ptp;
version_ptp = 0x0F & tvb_get_guint8(tvb, PTP_V2_VERSIONPTP_OFFSET);
if( version_ptp == 2) return TRUE;
else return FALSE;
}
/* Code to actually dissect the PTPv1 packets */
static void
dissect_ptp_v1(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
guint8 ptp_control, ptp_mm_messagekey = 0;
nstime_t ts; /* time structure with seconds and nanoseconds */
/* Set up structures needed to add the protocol subtree and manage it */
proto_item *ti, *flags_ti, *time_ti, *time2_ti;
proto_tree *ptp_tree = NULL, *ptp_flags_tree, *ptp_time_tree, *ptp_time2_tree;
/* Make entries in Protocol column and Info column on summary display */
col_set_str(pinfo->cinfo, COL_PROTOCOL, "PTPv1");
/* Get control field (what kind of message is this? (Sync, DelayReq, ...) */
ptp_control = tvb_get_guint8 (tvb, PTP_CONTROL_OFFSET);
/* MGMT packet? */
if ( ptp_control == PTP_MANAGEMENT_MESSAGE ){
/* Get the managementMessageKey */
ptp_mm_messagekey = tvb_get_guint8(tvb, PTP_MM_MANAGEMENTMESSAGEKEY_OFFSET);
}
/* Create and set the string for "Info" column */
switch(ptp_control){
case PTP_SYNC_MESSAGE:{
col_set_str(pinfo->cinfo, COL_INFO, "Sync Message");
break;
}
case PTP_DELAY_REQ_MESSAGE:{
col_set_str(pinfo->cinfo, COL_INFO, "Delay_Request Message");
break;
}
case PTP_FOLLOWUP_MESSAGE:{
col_set_str(pinfo->cinfo, COL_INFO, "Follow_Up Message");
break;
}
case PTP_DELAY_RESP_MESSAGE:{
col_set_str(pinfo->cinfo, COL_INFO, "Delay_Response Message");
break;
}
case PTP_MANAGEMENT_MESSAGE:{
col_add_fstr(pinfo->cinfo, COL_INFO, "Management Message (%s)",
val_to_str_ext(ptp_mm_messagekey,
&ptp_managementMessageKey_infocolumn_vals_ext,
"Unknown message key %u"));
break;
}
default:{
col_set_str(pinfo->cinfo, COL_INFO, "Unknown Message");
break;
}
}
if (tree) {
/* create display subtree for the protocol */
ti = proto_tree_add_item(tree, proto_ptp, tvb, 0, -1, ENC_NA);
ptp_tree = proto_item_add_subtree(ti, ett_ptp);
proto_tree_add_item(ptp_tree,
hf_ptp_versionptp, tvb, PTP_VERSIONPTP_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_versionnetwork, tvb, PTP_VERSIONNETWORK_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_subdomain, tvb, PTP_SUBDOMAIN_OFFSET, 16, ENC_ASCII|ENC_NA);
proto_tree_add_item(ptp_tree,
hf_ptp_messagetype, tvb, PTP_MESSAGETYPE_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_sourcecommunicationtechnology, tvb, PTP_SOURCECOMMUNICATIONTECHNOLOGY_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_sourceuuid, tvb, PTP_SOURCEUUID_OFFSET, 6, ENC_NA);
proto_tree_add_item(ptp_tree,
hf_ptp_sourceportid, tvb, PTP_SOURCEPORTID_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_sequenceid, tvb, PTP_SEQUENCEID_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_control, tvb, PTP_CONTROL_OFFSET, 1, ENC_BIG_ENDIAN);
/* Subtree for the flag-field */
if(tree){
flags_ti = proto_tree_add_item(ptp_tree,
hf_ptp_flags, tvb, PTP_FLAGS_OFFSET, 2, ENC_BIG_ENDIAN);
ptp_flags_tree = proto_item_add_subtree(flags_ti, ett_ptp_flags);
proto_tree_add_item(ptp_flags_tree,
hf_ptp_flags_li61, tvb, PTP_FLAGS_LI61_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_flags_tree,
hf_ptp_flags_li59, tvb, PTP_FLAGS_LI59_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_flags_tree,
hf_ptp_flags_boundary_clock, tvb, PTP_FLAGS_BOUNDARY_CLOCK_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_flags_tree,
hf_ptp_flags_assist, tvb, PTP_FLAGS_ASSIST_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_flags_tree,
hf_ptp_flags_ext_sync, tvb, PTP_FLAGS_EXT_SYNC_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_flags_tree,
hf_ptp_flags_parent, tvb, PTP_FLAGS_PARENT_STATS_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_flags_tree,
hf_ptp_flags_sync_burst, tvb, PTP_FLAGS_SYNC_BURST_OFFSET, 2, ENC_BIG_ENDIAN);
}
/* The rest of the ptp-dissector depends on the control-field */
switch(ptp_control){
case PTP_SYNC_MESSAGE:
case PTP_DELAY_REQ_MESSAGE:{
/* Subtree for the timestamp-field */
ts.secs = tvb_get_ntohl(tvb, PTP_SDR_ORIGINTIMESTAMP_SECONDS_OFFSET);
ts.nsecs = tvb_get_ntohl(tvb, PTP_SDR_ORIGINTIMESTAMP_NANOSECONDS_OFFSET);
if(tree){
time_ti = proto_tree_add_time(ptp_tree,
hf_ptp_sdr_origintimestamp, tvb, PTP_SDR_ORIGINTIMESTAMP_OFFSET, 8, &ts);
ptp_time_tree = proto_item_add_subtree(time_ti, ett_ptp_time);
proto_tree_add_item(ptp_time_tree,
hf_ptp_sdr_origintimestamp_seconds, tvb,
PTP_SDR_ORIGINTIMESTAMP_SECONDS_OFFSET, 4, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_time_tree, hf_ptp_sdr_origintimestamp_nanoseconds, tvb,
PTP_SDR_ORIGINTIMESTAMP_NANOSECONDS_OFFSET, 4, ENC_BIG_ENDIAN);
}
proto_tree_add_item(ptp_tree,
hf_ptp_sdr_epochnumber, tvb, PTP_SDR_EPOCHNUMBER_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_sdr_currentutcoffset, tvb, PTP_SDR_CURRENTUTCOFFSET_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_sdr_grandmastercommunicationtechnology, tvb,
PTP_SDR_GRANDMASTERCOMMUNICATIONTECHNOLOGY_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_sdr_grandmasterclockuuid, tvb, PTP_SDR_GRANDMASTERCLOCKUUID_OFFSET, 6, ENC_NA);
proto_tree_add_item(ptp_tree,
hf_ptp_sdr_grandmasterportid, tvb, PTP_SDR_GRANDMASTERPORTID_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_sdr_grandmastersequenceid, tvb, PTP_SDR_GRANDMASTERSEQUENCEID_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_sdr_grandmasterclockstratum, tvb,
PTP_SDR_GRANDMASTERCLOCKSTRATUM_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_sdr_grandmasterclockidentifier, tvb,
PTP_SDR_GRANDMASTERCLOCKIDENTIFIER_OFFSET, 4, ENC_ASCII|ENC_NA);
proto_tree_add_item(ptp_tree,
hf_ptp_sdr_grandmasterclockvariance, tvb,
PTP_SDR_GRANDMASTERCLOCKVARIANCE_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_sdr_grandmasterpreferred, tvb, PTP_SDR_GRANDMASTERPREFERRED_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_sdr_grandmasterisboundaryclock, tvb,
PTP_SDR_GRANDMASTERISBOUNDARYCLOCK_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_sdr_syncinterval, tvb, PTP_SDR_SYNCINTERVAL_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_sdr_localclockvariance, tvb, PTP_SDR_LOCALCLOCKVARIANCE_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_sdr_localstepsremoved, tvb, PTP_SDR_LOCALSTEPSREMOVED_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_sdr_localclockstratum, tvb, PTP_SDR_LOCALCLOCKSTRATUM_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_sdr_localclockidentifier, tvb, PTP_SDR_LOCALCLOCKIDENTIFIER_OFFSET, 4, ENC_ASCII|ENC_NA);
proto_tree_add_item(ptp_tree, hf_ptp_sdr_parentcommunicationtechnology, tvb,
PTP_SDR_PARENTCOMMUNICATIONTECHNOLOGY_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_sdr_parentuuid, tvb, PTP_SDR_PARENTUUID_OFFSET, 6, ENC_NA);
proto_tree_add_item(ptp_tree,
hf_ptp_sdr_parentportfield, tvb, PTP_SDR_PARENTPORTFIELD_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_sdr_estimatedmastervariance, tvb,
PTP_SDR_ESTIMATEDMASTERVARIANCE_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_sdr_estimatedmasterdrift, tvb, PTP_SDR_ESTIMATEDMASTERDRIFT_OFFSET, 4, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_sdr_utcreasonable, tvb, PTP_SDR_UTCREASONABLE_OFFSET, 1, ENC_BIG_ENDIAN);
break;
}
case PTP_FOLLOWUP_MESSAGE:{
proto_tree_add_item(ptp_tree,
hf_ptp_fu_associatedsequenceid, tvb, PTP_FU_ASSOCIATEDSEQUENCEID_OFFSET, 2, ENC_BIG_ENDIAN);
/* Subtree for the timestamp-field */
ts.secs = tvb_get_ntohl(tvb, PTP_FU_PRECISEORIGINTIMESTAMP_SECONDS_OFFSET);
ts.nsecs = tvb_get_ntohl(tvb, PTP_FU_PRECISEORIGINTIMESTAMP_NANOSECONDS_OFFSET);
if(tree){
time_ti = proto_tree_add_time(ptp_tree,
hf_ptp_fu_preciseorigintimestamp, tvb,
PTP_FU_PRECISEORIGINTIMESTAMP_OFFSET, 8, &ts);
ptp_time_tree = proto_item_add_subtree(time_ti, ett_ptp_time);
proto_tree_add_item(ptp_time_tree, hf_ptp_fu_preciseorigintimestamp_seconds, tvb,
PTP_FU_PRECISEORIGINTIMESTAMP_SECONDS_OFFSET, 4, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_time_tree, hf_ptp_fu_preciseorigintimestamp_nanoseconds, tvb,
PTP_FU_PRECISEORIGINTIMESTAMP_NANOSECONDS_OFFSET, 4, ENC_BIG_ENDIAN);
}
break;
}
case PTP_DELAY_RESP_MESSAGE:{
/* Subtree for the timestamp-field */
ts.secs = tvb_get_ntohl(tvb, PTP_DR_DELAYRECEIPTTIMESTAMP_SECONDS_OFFSET);
ts.nsecs = tvb_get_ntohl(tvb, PTP_DR_DELAYRECEIPTTIMESTAMP_NANOSECONDS_OFFSET);
if(tree){
time_ti = proto_tree_add_time(ptp_tree,
hf_ptp_dr_delayreceipttimestamp, tvb,
PTP_DR_DELAYRECEIPTTIMESTAMP_OFFSET, 8, &ts);
ptp_time_tree = proto_item_add_subtree(time_ti, ett_ptp_time);
proto_tree_add_item(ptp_time_tree, hf_ptp_dr_delayreceipttimestamp_seconds, tvb,
PTP_DR_DELAYRECEIPTTIMESTAMP_SECONDS_OFFSET, 4, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_time_tree, hf_ptp_dr_delayreceipttimestamp_nanoseconds, tvb,
PTP_DR_DELAYRECEIPTTIMESTAMP_NANOSECONDS_OFFSET, 4, ENC_BIG_ENDIAN);
}
proto_tree_add_item(ptp_tree, hf_ptp_dr_requestingsourcecommunicationtechnology, tvb,
PTP_DR_REQUESTINGSOURCECOMMUNICATIONTECHNOLOGY_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_dr_requestingsourceuuid, tvb, PTP_DR_REQUESTINGSOURCEUUID_OFFSET, 6, ENC_NA);
proto_tree_add_item(ptp_tree,
hf_ptp_dr_requestingsourceportid, tvb, PTP_DR_REQUESTINGSOURCEPORTID_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_dr_requestingsourcesequenceid, tvb,
PTP_DR_REQUESTINGSOURCESEQUENCEID_OFFSET, 2, ENC_BIG_ENDIAN);
break;
}
case PTP_MANAGEMENT_MESSAGE:{
proto_tree_add_item(ptp_tree, hf_ptp_mm_targetcommunicationtechnology, tvb,
PTP_MM_TARGETCOMMUNICATIONTECHNOLOGY_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_mm_targetuuid, tvb, PTP_MM_TARGETUUID_OFFSET, 6, ENC_NA);
proto_tree_add_item(ptp_tree,
hf_ptp_mm_targetportid, tvb, PTP_MM_TARGETPORTID_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_mm_startingboundaryhops, tvb, PTP_MM_STARTINGBOUNDARYHOPS_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_mm_boundaryhops, tvb, PTP_MM_BOUNDARYHOPS_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_mm_managementmessagekey, tvb, PTP_MM_MANAGEMENTMESSAGEKEY_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_mm_parameterlength, tvb, PTP_MM_PARAMETERLENGTH_OFFSET, 2, ENC_BIG_ENDIAN);
switch(ptp_mm_messagekey){
case PTP_MM_CLOCK_IDENTITY:{
proto_tree_add_item(ptp_tree,
hf_ptp_mm_clock_identity_clockcommunicationtechnology, tvb,
PTP_MM_CLOCK_IDENTITY_CLOCKCOMMUNICATIONTECHNOLOGY_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_clock_identity_clockuuidfield, tvb,
PTP_MM_CLOCK_IDENTITY_CLOCKUUIDFIELD_OFFSET, 6, ENC_NA);
proto_tree_add_item(ptp_tree, hf_ptp_mm_clock_identity_clockportfield, tvb,
PTP_MM_CLOCK_IDENTITY_CLOCKPORTFIELD_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_clock_identity_manufactureridentity, tvb,
PTP_MM_CLOCK_IDENTITY_MANUFACTURERIDENTITY_OFFSET, 48, ENC_NA);
break;
}
case PTP_MM_INITIALIZE_CLOCK:{
proto_tree_add_item(ptp_tree, hf_ptp_mm_initialize_clock_initialisationkey, tvb,
PTP_MM_INITIALIZE_CLOCK_INITIALISATIONKEY_OFFSET, 2, ENC_BIG_ENDIAN);
break;
}
case PTP_MM_SET_SUBDOMAIN:{
proto_tree_add_item(ptp_tree, hf_ptp_mm_set_subdomain_subdomainname, tvb,
PTP_MM_SET_SUBDOMAIN_SUBDOMAINNAME_OFFSET, 16, ENC_ASCII|ENC_NA);
break;
}
case PTP_MM_DEFAULT_DATA_SET:{
proto_tree_add_item(ptp_tree, hf_ptp_mm_default_data_set_clockcommunicationtechnology,
tvb, PTP_MM_DEFAULT_DATA_SET_CLOCKCOMMUNICATIONTECHNOLOGY_OFFSET,
1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_default_data_set_clockuuidfield, tvb,
PTP_MM_DEFAULT_DATA_SET_CLOCKUUIDFIELD_OFFSET, 6, ENC_NA);
proto_tree_add_item(ptp_tree, hf_ptp_mm_default_data_set_clockportfield, tvb,
PTP_MM_DEFAULT_DATA_SET_CLOCKPORTFIELD_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_default_data_set_clockstratum, tvb,
PTP_MM_DEFAULT_DATA_SET_CLOCKSTRATUM_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_default_data_set_clockidentifier, tvb,
PTP_MM_DEFAULT_DATA_SET_CLOCKIDENTIFIER_OFFSET, 4, ENC_NA);
proto_tree_add_item(ptp_tree, hf_ptp_mm_default_data_set_clockvariance, tvb,
PTP_MM_DEFAULT_DATA_SET_CLOCKVARIANCE_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_default_data_set_clockfollowupcapable, tvb,
PTP_MM_DEFAULT_DATA_SET_CLOCKFOLLOWUPCAPABLE_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_default_data_set_preferred, tvb,
PTP_MM_DEFAULT_DATA_SET_PREFERRED_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_default_data_set_initializable, tvb,
PTP_MM_DEFAULT_DATA_SET_INITIALIZABLE_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_default_data_set_externaltiming, tvb,
PTP_MM_DEFAULT_DATA_SET_EXTERNALTIMING_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_default_data_set_isboundaryclock, tvb,
PTP_MM_DEFAULT_DATA_SET_ISBOUNDARYCLOCK_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_default_data_set_syncinterval, tvb,
PTP_MM_DEFAULT_DATA_SET_SYNCINTERVAL_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_default_data_set_subdomainname, tvb,
PTP_MM_DEFAULT_DATA_SET_SUBDOMAINNAME_OFFSET, 16, ENC_ASCII|ENC_NA);
proto_tree_add_item(ptp_tree, hf_ptp_mm_default_data_set_numberports, tvb,
PTP_MM_DEFAULT_DATA_SET_NUMBERPORTS_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_default_data_set_numberforeignrecords, tvb,
PTP_MM_DEFAULT_DATA_SET_NUMBERFOREIGNRECORDS_OFFSET, 2, ENC_BIG_ENDIAN);
break;
}
case PTP_MM_UPDATE_DEFAULT_DATA_SET:{
proto_tree_add_item(ptp_tree, hf_ptp_mm_update_default_data_set_clockstratum, tvb,
PTP_MM_UPDATE_DEFAULT_DATA_SET_CLOCKSTRATUM_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_update_default_data_set_clockidentifier, tvb,
PTP_MM_UPDATE_DEFAULT_DATA_SET_CLOCKIDENTIFIER_OFFSET, 4, ENC_NA);
proto_tree_add_item(ptp_tree, hf_ptp_mm_update_default_data_set_clockvariance, tvb,
PTP_MM_UPDATE_DEFAULT_DATA_SET_CLOCKVARIANCE_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_update_default_data_set_preferred, tvb,
PTP_MM_UPDATE_DEFAULT_DATA_SET_PREFERRED_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_update_default_data_set_syncinterval, tvb,
PTP_MM_UPDATE_DEFAULT_DATA_SET_SYNCINTERVAL_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_update_default_data_set_subdomainname, tvb,
PTP_MM_UPDATE_DEFAULT_DATA_SET_SUBDOMAINNAME_OFFSET, 16, ENC_ASCII|ENC_NA);
break;
}
case PTP_MM_CURRENT_DATA_SET:{
proto_tree_add_item(ptp_tree, hf_ptp_mm_current_data_set_stepsremoved, tvb,
PTP_MM_CURRENT_DATA_SET_STEPSREMOVED_OFFSET, 2, ENC_BIG_ENDIAN);
/* Subtree for offset from master */
ts.secs = tvb_get_ntohl(tvb, PTP_MM_CURRENT_DATA_SET_OFFSETFROMMASTERSECONDS_OFFSET);
ts.nsecs = tvb_get_ntohl(tvb,
PTP_MM_CURRENT_DATA_SET_OFFSETFROMMASTERNANOSECONDS_OFFSET);
if (ts.nsecs & 0x80000000) ts.nsecs = ts.nsecs & 0x7FFFFFFF;
if(tree){
time_ti = proto_tree_add_time(ptp_tree,
hf_ptp_mm_current_data_set_offsetfrommaster, tvb,
PTP_MM_CURRENT_DATA_SET_OFFSETFROMMASTER_OFFSET, 8, &ts);
ptp_time_tree = proto_item_add_subtree(time_ti, ett_ptp_time);
proto_tree_add_item(ptp_time_tree,
hf_ptp_mm_current_data_set_offsetfrommasterseconds, tvb,
PTP_MM_CURRENT_DATA_SET_OFFSETFROMMASTERSECONDS_OFFSET, 4, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_time_tree,
hf_ptp_mm_current_data_set_offsetfrommasternanoseconds, tvb,
PTP_MM_CURRENT_DATA_SET_OFFSETFROMMASTERNANOSECONDS_OFFSET, 4, ENC_BIG_ENDIAN);
}
/* Subtree for offset from master */
ts.secs = tvb_get_ntohl(tvb, PTP_MM_CURRENT_DATA_SET_ONEWAYDELAYSECONDS_OFFSET);
ts.nsecs = tvb_get_ntohl(tvb, PTP_MM_CURRENT_DATA_SET_ONEWAYDELAYNANOSECONDS_OFFSET);
if(tree){
time2_ti = proto_tree_add_time(ptp_tree,
hf_ptp_mm_current_data_set_onewaydelay, tvb,
PTP_MM_CURRENT_DATA_SET_ONEWAYDELAY_OFFSET, 8, &ts);
ptp_time2_tree = proto_item_add_subtree(time2_ti, ett_ptp_time2);
proto_tree_add_item(ptp_time2_tree, hf_ptp_mm_current_data_set_onewaydelayseconds,
tvb, PTP_MM_CURRENT_DATA_SET_ONEWAYDELAYSECONDS_OFFSET, 4, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_time2_tree,
hf_ptp_mm_current_data_set_onewaydelaynanoseconds,
tvb, PTP_MM_CURRENT_DATA_SET_ONEWAYDELAYNANOSECONDS_OFFSET, 4, ENC_BIG_ENDIAN);
}
break;
}
case PTP_MM_PARENT_DATA_SET:{
proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_parentcommunicationtechnology,
tvb, PTP_MM_PARENT_DATA_SET_PARENTCOMMUNICATIONTECHNOLOGY_OFFSET,
1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_parentuuid, tvb,
PTP_MM_PARENT_DATA_SET_PARENTUUID_OFFSET, 6, ENC_NA);
proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_parentportid, tvb,
PTP_MM_PARENT_DATA_SET_PARENTPORTID_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_parentlastsyncsequencenumber,
tvb, PTP_MM_PARENT_DATA_SET_PARENTLASTSYNCSEQUENCENUMBER_OFFSET,
2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_parentfollowupcapable, tvb,
PTP_MM_PARENT_DATA_SET_PARENTFOLLOWUPCAPABLE_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_parentexternaltiming, tvb,
PTP_MM_PARENT_DATA_SET_PARENTEXTERNALTIMING_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_parentvariance, tvb,
PTP_MM_PARENT_DATA_SET_PARENTVARIANCE_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_parentstats, tvb,
PTP_MM_PARENT_DATA_SET_PARENTSTATS_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_observedvariance, tvb,
PTP_MM_PARENT_DATA_SET_OBSERVEDVARIANCE_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_observeddrift, tvb,
PTP_MM_PARENT_DATA_SET_OBSERVEDDRIFT_OFFSET, 4, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_utcreasonable, tvb,
PTP_MM_PARENT_DATA_SET_UTCREASONABLE_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_mm_parent_data_set_grandmastercommunicationtechnology,
tvb, PTP_MM_PARENT_DATA_SET_GRANDMASTERCOMMUNICATIONTECHNOLOGY_OFFSET, 1,
ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_grandmasteruuidfield, tvb,
PTP_MM_PARENT_DATA_SET_GRANDMASTERUUIDFIELD_OFFSET, 6, ENC_NA);
proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_grandmasterportidfield, tvb,
PTP_MM_PARENT_DATA_SET_GRANDMASTERPORTIDFIELD_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_grandmasterstratum, tvb,
PTP_MM_PARENT_DATA_SET_GRANDMASTERSTRATUM_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_grandmasteridentifier, tvb,
PTP_MM_PARENT_DATA_SET_GRANDMASTERIDENTIFIER_OFFSET, 4, ENC_NA);
proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_grandmastervariance, tvb,
PTP_MM_PARENT_DATA_SET_GRANDMASTERVARIANCE_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_grandmasterpreferred, tvb,
PTP_MM_PARENT_DATA_SET_GRANDMASTERPREFERRED_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_grandmasterisboundaryclock, tvb,
PTP_MM_PARENT_DATA_SET_GRANDMASTERISBOUNDARYCLOCK_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_parent_data_set_grandmastersequencenumber, tvb,
PTP_MM_PARENT_DATA_SET_GRANDMASTERSEQUENCENUMBER_OFFSET, 2, ENC_BIG_ENDIAN);
break;
}
case PTP_MM_PORT_DATA_SET:{
proto_tree_add_item(ptp_tree, hf_ptp_mm_port_data_set_returnedportnumber, tvb,
PTP_MM_PORT_DATA_SET_RETURNEDPORTNUMBER_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_port_data_set_portstate, tvb,
PTP_MM_PORT_DATA_SET_PORTSTATE_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_port_data_set_lastsynceventsequencenumber, tvb,
PTP_MM_PORT_DATA_SET_LASTSYNCEVENTSEQUENCENUMBER_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_port_data_set_lastgeneraleventsequencenumber,
tvb, PTP_MM_PORT_DATA_SET_LASTGENERALEVENTSEQUENCENUMBER_OFFSET,
2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_port_data_set_portcommunicationtechnology, tvb,
PTP_MM_PORT_DATA_SET_PORTCOMMUNICATIONTECHNOLOGY_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_port_data_set_portuuidfield, tvb,
PTP_MM_PORT_DATA_SET_PORTUUIDFIELD_OFFSET, 6, ENC_NA);
proto_tree_add_item(ptp_tree, hf_ptp_mm_port_data_set_portidfield, tvb,
PTP_MM_PORT_DATA_SET_PORTIDFIELD_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_port_data_set_burstenabled, tvb,
PTP_MM_PORT_DATA_SET_BURSTENABLED_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_port_data_set_subdomainaddressoctets, tvb,
PTP_MM_PORT_DATA_SET_SUBDOMAINADDRESSOCTETS_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_port_data_set_eventportaddressoctets, tvb,
PTP_MM_PORT_DATA_SET_EVENTPORTADDRESSOCTETS_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_port_data_set_generalportaddressoctets, tvb,
PTP_MM_PORT_DATA_SET_GENERALPORTADDRESSOCTETS_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_port_data_set_subdomainaddress, tvb,
PTP_MM_PORT_DATA_SET_SUBDOMAINADDRESS_OFFSET, 4, ENC_NA);
proto_tree_add_item(ptp_tree, hf_ptp_mm_port_data_set_eventportaddress, tvb,
PTP_MM_PORT_DATA_SET_EVENTPORTADDRESS_OFFSET, 2, ENC_NA);
proto_tree_add_item(ptp_tree, hf_ptp_mm_port_data_set_generalportaddress, tvb,
PTP_MM_PORT_DATA_SET_GENERALPORTADDRESS_OFFSET, 2, ENC_NA);
break;
}
case PTP_MM_GLOBAL_TIME_DATA_SET:{
/* Subtree for local time */
ts.secs = tvb_get_ntohl(tvb, PTP_MM_GLOBAL_TIME_DATA_SET_LOCALTIMESECONDS_OFFSET);
ts.nsecs = tvb_get_ntohl(tvb,
PTP_MM_GLOBAL_TIME_DATA_SET_LOCALTIMENANOSECONDS_OFFSET);
if(tree){
time_ti = proto_tree_add_time(ptp_tree,
hf_ptp_mm_global_time_data_set_localtime, tvb,
PTP_MM_GLOBAL_TIME_DATA_SET_LOCALTIME_OFFSET, 8, &ts);
ptp_time_tree = proto_item_add_subtree(time_ti, ett_ptp_time);
proto_tree_add_item(ptp_time_tree,
hf_ptp_mm_global_time_data_set_localtimeseconds, tvb,
PTP_MM_GLOBAL_TIME_DATA_SET_LOCALTIMESECONDS_OFFSET, 4, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_time_tree,
hf_ptp_mm_global_time_data_set_localtimenanoseconds,
tvb, PTP_MM_GLOBAL_TIME_DATA_SET_LOCALTIMENANOSECONDS_OFFSET, 4, ENC_BIG_ENDIAN);
}
proto_tree_add_item(ptp_tree, hf_ptp_mm_global_time_data_set_currentutcoffset, tvb,
PTP_MM_GLOBAL_TIME_DATA_SET_CURRENTUTCOFFSET_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_global_time_data_set_leap59, tvb,
PTP_MM_GLOBAL_TIME_DATA_SET_LEAP59_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_global_time_data_set_leap61, tvb,
PTP_MM_GLOBAL_TIME_DATA_SET_LEAP61_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_global_time_data_set_epochnumber, tvb,
PTP_MM_GLOBAL_TIME_DATA_SET_EPOCHNUMBER_OFFSET, 2, ENC_BIG_ENDIAN);
break;
}
case PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES:{
proto_tree_add_item(ptp_tree, hf_ptp_mm_update_global_time_properties_currentutcoffset,
tvb, PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES_CURRENTUTCOFFSET_OFFSET,
2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_update_global_time_properties_leap59, tvb,
PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES_LEAP59_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_update_global_time_properties_leap61, tvb,
PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES_LEAP61_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_get_foreign_data_set_recordkey, tvb,
PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES_EPOCHNUMBER_OFFSET, 2, ENC_BIG_ENDIAN);
break;
}
case PTP_MM_GET_FOREIGN_DATA_SET:{
proto_tree_add_item(ptp_tree, hf_ptp_mm_get_foreign_data_set_recordkey, tvb,
PTP_MM_GET_FOREIGN_DATA_SET_RECORDKEY_OFFSET, 2, ENC_BIG_ENDIAN);
break;
}
case PTP_MM_FOREIGN_DATA_SET:{
proto_tree_add_item(ptp_tree, hf_ptp_mm_foreign_data_set_returnedportnumber, tvb,
PTP_MM_FOREIGN_DATA_SET_RETURNEDPORTNUMBER_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_foreign_data_set_returnedrecordnumber, tvb,
PTP_MM_FOREIGN_DATA_SET_RETURNEDRECORDNUMBER_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_mm_foreign_data_set_foreignmastercommunicationtechnology,
tvb, PTP_MM_FOREIGN_DATA_SET_FOREIGNMASTERCOMMUNICATIONTECHNOLOGY_OFFSET, 1,
ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_foreign_data_set_foreignmasteruuidfield, tvb,
PTP_MM_FOREIGN_DATA_SET_FOREIGNMASTERUUIDFIELD_OFFSET, 6, ENC_NA);
proto_tree_add_item(ptp_tree, hf_ptp_mm_foreign_data_set_foreignmasterportidfield, tvb,
PTP_MM_FOREIGN_DATA_SET_FOREIGNMASTERPORTIDFIELD_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_mm_foreign_data_set_foreignmastersyncs, tvb,
PTP_MM_FOREIGN_DATA_SET_FOREIGNMASTERSYNCS_OFFSET, 2, ENC_BIG_ENDIAN);
break;
}
case PTP_MM_SET_SYNC_INTERVAL:{
proto_tree_add_item(ptp_tree, hf_ptp_mm_set_sync_interval_syncinterval, tvb,
PTP_MM_SET_SYNC_INTERVAL_SYNCINTERVAL_OFFSET, 2, ENC_BIG_ENDIAN);
break;
}
case PTP_MM_SET_TIME:{
/* Subtree for local time */
ts.secs = tvb_get_ntohl(tvb, PTP_MM_SET_TIME_LOCALTIMESECONDS_OFFSET);
ts.nsecs = tvb_get_ntohl(tvb, PTP_MM_SET_TIME_LOCALTIMENANOSECONDS_OFFSET);
if(tree){
time_ti = proto_tree_add_time(ptp_tree, hf_ptp_mm_set_time_localtime, tvb,
PTP_MM_SET_TIME_LOCALTIME_OFFSET, 8, &ts);
ptp_time_tree = proto_item_add_subtree(time_ti, ett_ptp_time);
proto_tree_add_item(ptp_time_tree, hf_ptp_mm_set_time_localtimeseconds, tvb,
PTP_MM_SET_TIME_LOCALTIMESECONDS_OFFSET, 4, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_time_tree, hf_ptp_mm_set_time_localtimenanoseconds,
tvb, PTP_MM_SET_TIME_LOCALTIMENANOSECONDS_OFFSET, 4, ENC_BIG_ENDIAN);
}
break;
}
default :{
/* - don't dissect any further. */
break;
}
}
break;
}
default :{
/* Not a valid MessageType - can't dissect. */
break;
}
}
}
}
/* Code to dissect PTPText */
static void
dissect_ptp_v2_text(tvbuff_t *tvb, guint16 *cur_offset, proto_tree *tree, int hf_ptp_v2_mm_ptptext, int hf_ptp_v2_mm_ptptext_length)
{
guint8 length = 0;
proto_item *ptptext_ti;
proto_tree *ptptext_subtree;
length = tvb_get_guint8 (tvb, *cur_offset);
if (tree)
{
ptptext_ti = proto_tree_add_item(tree, hf_ptp_v2_mm_ptptext, tvb,
*cur_offset+1, length, ENC_BIG_ENDIAN);
ptptext_subtree = proto_item_add_subtree(ptptext_ti, ett_ptp_v2_ptptext);
/* subtree */
proto_tree_add_item(ptptext_subtree, hf_ptp_v2_mm_ptptext_length, tvb,
*cur_offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptptext_subtree, hf_ptp_v2_mm_ptptext, tvb,
*cur_offset+1, length, ENC_ASCII|ENC_NA);
*cur_offset = *cur_offset + length + 1;
}
}
static void
dissect_ptp_v2_timeInterval(tvbuff_t *tvb, guint16 *cur_offset, proto_tree *tree, const char* name, int hf_ptp_v2_timeInterval_ns, int hf_ptp_v2_timeInterval_subns)
{
double time_double;
gint64 time_ns;
guint16 time_subns;
proto_tree *ptptimeInterval_subtree;
time_ns = tvb_get_ntoh64(tvb, *cur_offset);
time_double = (1.0*time_ns) / 65536.0;
time_ns = time_ns >> 16;
time_subns = tvb_get_ntohs(tvb, *cur_offset+6);
ptptimeInterval_subtree = proto_tree_add_subtree_format(tree, tvb, *cur_offset, 8,
ett_ptp_v2_timeInterval, NULL, "%s: %f nanoseconds", name, time_double);
proto_tree_add_uint64_format_value(ptptimeInterval_subtree,
hf_ptp_v2_timeInterval_ns, tvb, *cur_offset, 6, time_ns, "Ns: %" G_GINT64_MODIFIER "d nanoseconds", time_ns);
proto_tree_add_double_format_value(ptptimeInterval_subtree,
hf_ptp_v2_timeInterval_subns, tvb, *cur_offset+6, 2, (time_subns/65536.0),
"%f nanoseconds", (time_subns/65536.0));
*cur_offset = *cur_offset + 8;
}
/* Code to actually dissect the PTPv2 packets */
static void
dissect_ptp_v2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboolean ptpv2_oE)
{
guint8 ptp_v2_transport_specific;
guint8 ptp_v2_messageid;
guint64 timeStamp;
guint16 msg_len;
guint16 temp;
/* Set up structures needed to add the protocol subtree and manage it */
proto_item *ti = NULL, *msg_len_item = NULL, *transportspecific_ti, *flags_ti, *managementData_ti, *clockType_ti, *protocolAddress_ti;
proto_tree *ptp_tree = NULL, *ptp_transportspecific_tree, *ptp_flags_tree, *ptp_managementData_tree,
*ptp_clockType_tree, *ptp_protocolAddress_tree;
/* Make entries in Protocol column and Info column on summary display */
col_set_str(pinfo->cinfo, COL_PROTOCOL, "PTPv2");
/* Get transport specific bit to determine whether this is an AS packet or not */
ptp_v2_transport_specific = 0xF0 & tvb_get_guint8 (tvb, PTP_V2_TRANSPORT_SPECIFIC_MESSAGE_ID_OFFSET);
/* Get control field (what kind of message is this? (Sync, DelayReq, ...) */
ptp_v2_messageid = 0x0F & tvb_get_guint8 (tvb, PTP_V2_TRANSPORT_SPECIFIC_MESSAGE_ID_OFFSET);
msg_len = tvb_get_ntohs(tvb, PTP_V2_MESSAGE_LENGTH_OFFSET);
/* Extend Info column with managementId */
/* Create and set the string for "Info" column */
if ( ptp_v2_messageid == PTP_V2_MANAGEMENT_MESSAGE )
{
guint16 tlv_type;
/* Get TLV Type */
tlv_type = tvb_get_ntohs (tvb, PTP_V2_MM_TLV_TYPE_OFFSET);
/* For management there are PTP_V2_TLV_TYPE_MANAGEMENT and PTP_V2_TLV_TYPE_MANAGEMENT_ERROR_STATUS TLVs */
switch(tlv_type)
{
case PTP_V2_TLV_TYPE_MANAGEMENT:
{
guint16 ptp_v2_mm_managementId;
guint8 ptp_v2_management_action;
/* Get the managementId */
ptp_v2_mm_managementId = tvb_get_ntohs(tvb, PTP_V2_MM_TLV_MANAGEMENTID_OFFSET);
ptp_v2_management_action = 0x0F & tvb_get_guint8(tvb, PTP_V2_MM_ACTION_OFFSET);
col_add_fstr(pinfo->cinfo, COL_INFO, "Management (%s) %s",
val_to_str_ext(ptp_v2_mm_managementId, &ptp_v2_managementID_infocolumn_vals_ext, "Unknown management Id %u"),
val_to_str(ptp_v2_management_action, ptp_v2_mm_action_vals, "Unknown Action %u"));
break;
}
case PTP_V2_TLV_TYPE_MANAGEMENT_ERROR_STATUS:
{
guint16 ptp_v2_mm_managementId;
/* Get the managementErrorId */
ptp_v2_mm_managementId = tvb_get_ntohs(tvb, PTP_V2_MM_TLV_MANAGEMENTERRORID_OFFSET);
col_add_fstr(pinfo->cinfo, COL_INFO, "Management Error Message (%s)",
val_to_str_ext(ptp_v2_mm_managementId, &ptp_v2_managementErrorId_vals_ext, "Unknown Error Id %u"));
break;
}
default:
col_add_str(pinfo->cinfo, COL_INFO,
val_to_str_ext(ptp_v2_messageid, &ptp_v2_messageid_vals_ext, "Unknown PTP Message (%u)"));
break;
}
}
else
{
col_add_str(pinfo->cinfo, COL_INFO, val_to_str_ext(ptp_v2_messageid, &ptp_v2_messageid_vals_ext, "Unknown PTP Message (%u)"));
}
if (tree) {
ti = proto_tree_add_item(tree, proto_ptp, tvb, 0, -1, ENC_NA);
ptp_tree = proto_item_add_subtree(ti, ett_ptp_v2);
transportspecific_ti = proto_tree_add_item(ptp_tree,
hf_ptp_v2_transportspecific, tvb, PTP_V2_TRANSPORT_SPECIFIC_MESSAGE_ID_OFFSET, 1, ENC_BIG_ENDIAN);
ptp_transportspecific_tree = proto_item_add_subtree(transportspecific_ti, ett_ptp_v2_transportspecific);
if (ptpv2_oE == TRUE)
{
proto_tree_add_item(ptp_transportspecific_tree,
hf_ptp_v2_transportspecific_802as_conform, tvb, PTP_V2_TRANSPORT_SPECIFIC_MESSAGE_ID_OFFSET, 1, ENC_BIG_ENDIAN);
}
else
{
proto_tree_add_item(ptp_transportspecific_tree,
hf_ptp_v2_transportspecific_v1_compatibility, tvb, PTP_V2_TRANSPORT_SPECIFIC_MESSAGE_ID_OFFSET, 1, ENC_BIG_ENDIAN);
}
proto_tree_add_item(ptp_tree,
hf_ptp_v2_messageid, tvb, PTP_V2_TRANSPORT_SPECIFIC_MESSAGE_ID_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_v2_versionptp, tvb, PTP_V2_VERSIONPTP_OFFSET, 1, ENC_BIG_ENDIAN);
msg_len_item = proto_tree_add_item(ptp_tree,
hf_ptp_v2_messagelength, tvb, PTP_V2_MESSAGE_LENGTH_OFFSET, 2, ENC_BIG_ENDIAN);
}
/*
* Sanity-check the message length.
*/
if (msg_len > tvb_reported_length(tvb)) {
/* Bogus message length - runs past the end of the packet */
expert_add_info(pinfo, msg_len_item, &ei_ptp_v2_msg_len_too_large);
msg_len = tvb_reported_length(tvb);
} else if (msg_len < PTP_V2_MESSAGE_LENGTH_OFFSET + 2) {
/* Bogus message length - not long enough to include the message length field */
expert_add_info(pinfo, msg_len_item, &ei_ptp_v2_msg_len_too_small);
return;
} else {
/*
* Set the length of this tvbuff to the message length, chopping
* off extra data.
*/
set_actual_length(tvb, msg_len);
proto_item_set_len(ti, msg_len);
}
if (tree) {
proto_tree_add_item(ptp_tree,
hf_ptp_v2_domainnumber, tvb, PTP_V2_DOMAIN_NUMBER_OFFSET, 1, ENC_BIG_ENDIAN);
flags_ti = proto_tree_add_item(ptp_tree,
hf_ptp_v2_flags, tvb, PTP_V2_FLAGS_OFFSET, 2, ENC_BIG_ENDIAN);
ptp_flags_tree = proto_item_add_subtree(flags_ti, ett_ptp_v2_flags);
proto_tree_add_item(ptp_flags_tree,
hf_ptp_v2_flags_security, tvb, PTP_V2_FLAGS_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_flags_tree,
hf_ptp_v2_flags_specific2, tvb, PTP_V2_FLAGS_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_flags_tree,
hf_ptp_v2_flags_specific1, tvb, PTP_V2_FLAGS_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_flags_tree,
hf_ptp_v2_flags_unicast, tvb, PTP_V2_FLAGS_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_flags_tree,
hf_ptp_v2_flags_twostep, tvb, PTP_V2_FLAGS_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_flags_tree,
hf_ptp_v2_flags_alternatemaster, tvb, PTP_V2_FLAGS_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_flags_tree,
hf_ptp_v2_flags_frequencytraceable, tvb, PTP_V2_FLAGS_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_flags_tree,
hf_ptp_v2_flags_timetraceable, tvb, PTP_V2_FLAGS_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_flags_tree,
hf_ptp_v2_flags_ptptimescale, tvb, PTP_V2_FLAGS_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_flags_tree,
hf_ptp_v2_flags_utcoffsetvalid, tvb, PTP_V2_FLAGS_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_flags_tree,
hf_ptp_v2_flags_li59, tvb, PTP_V2_FLAGS_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_flags_tree,
hf_ptp_v2_flags_li61, tvb, PTP_V2_FLAGS_OFFSET, 2, ENC_BIG_ENDIAN);
temp = PTP_V2_CORRECTIONNS_OFFSET;
dissect_ptp_v2_timeInterval(tvb, &temp, ptp_tree, "correction", hf_ptp_v2_correction, hf_ptp_v2_correctionsubns);
proto_tree_add_item(ptp_tree,
hf_ptp_v2_clockidentity, tvb, PTP_V2_CLOCKIDENTITY_OFFSET, 8, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_v2_sourceportid, tvb, PTP_V2_SOURCEPORTID_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_v2_sequenceid, tvb, PTP_V2_SEQUENCEID_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_v2_control, tvb, PTP_V2_CONTROL_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_v2_logmessageperiod, tvb, PTP_V2_LOGMESSAGEPERIOD_OFFSET, 1, ENC_BIG_ENDIAN);
switch(ptp_v2_messageid){
case PTP_V2_ANNOUNCE_MESSAGE:{
guint16 Offset;
guint16 tlv_type;
guint16 tlv_length;
guint16 tlv_total_length;
proto_tree *ptp_tlv_tree;
/* In 802.1AS there is no origin timestamp in an Announce Message */
if(!(ptp_v2_transport_specific & PTP_V2_TRANSPORTSPECIFIC_ASPACKET_BITMASK)){
proto_tree_add_item(ptp_tree, hf_ptp_v2_an_origintimestamp_seconds, tvb,
PTP_V2_AN_ORIGINTIMESTAMPSECONDS_OFFSET, 6, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_v2_an_origintimestamp_nanoseconds, tvb,
PTP_V2_AN_ORIGINTIMESTAMPNANOSECONDS_OFFSET, 4, ENC_BIG_ENDIAN);
}
proto_tree_add_item(ptp_tree, hf_ptp_v2_an_origincurrentutcoffset, tvb,
PTP_V2_AN_ORIGINCURRENTUTCOFFSET_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_v2_an_priority1, tvb,
PTP_V2_AN_PRIORITY_1_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_v2_an_grandmasterclockclass, tvb,
PTP_V2_AN_GRANDMASTERCLOCKCLASS_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_v2_an_grandmasterclockaccuracy, tvb,
PTP_V2_AN_GRANDMASTERCLOCKACCURACY_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_v2_an_grandmasterclockvariance, tvb,
PTP_V2_AN_GRANDMASTERCLOCKVARIANCE_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_v2_an_priority2, tvb,
PTP_V2_AN_PRIORITY_2_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_v2_an_grandmasterclockidentity, tvb,
PTP_V2_AN_GRANDMASTERCLOCKIDENTITY_OFFSET, 8, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_v2_an_localstepsremoved, tvb,
PTP_V2_AN_LOCALSTEPSREMOVED_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree,
hf_ptp_v2_an_timesource, tvb, PTP_V2_AN_TIMESOURCE_OFFSET, 1, ENC_BIG_ENDIAN);
if (msg_len > 64)
{
tlv_total_length = 0;
/* XXX It seems like at least 4 bytes must reamain to have a tlv_type and tlv_length */
while (tvb_reported_length_remaining(tvb, PTP_V2_AN_TLV_OFFSET + tlv_total_length) >= 4)
{
/* There are TLV's to be processed */
tlv_type = tvb_get_ntohs (tvb, PTP_V2_AN_TLV_OFFSET+tlv_total_length+PTP_V2_AN_TLV_TYPE_OFFSET);
tlv_length = tvb_get_ntohs (tvb, PTP_V2_AN_TLV_OFFSET+tlv_total_length+PTP_V2_AN_TLV_LENGTHFIELD_OFFSET);
ptp_tlv_tree = proto_tree_add_subtree_format(
ptp_tree,
tvb,
PTP_V2_AN_TLV_OFFSET + tlv_total_length,
tlv_length + PTP_V2_AN_TLV_DATA_OFFSET,
ett_ptp_v2_tlv, NULL, "%s TLV",
val_to_str_ext(tlv_type,
&ptp_v2_TLV_type_vals_ext,
"Unknown (%u)"));
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_v2_an_tlv_tlvtype,
tvb,
PTP_V2_AN_TLV_OFFSET + tlv_total_length + PTP_V2_AN_TLV_TYPE_OFFSET,
2,
ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_v2_an_tlv_lengthfield,
tvb,
PTP_V2_AN_TLV_OFFSET + tlv_total_length + PTP_V2_AN_TLV_LENGTHFIELD_OFFSET,
2,
ENC_BIG_ENDIAN);
switch (tlv_type)
{
case PTP_V2_TLV_TYPE_ORGANIZATION_EXTENSION:
{
guint32 org_id;
guint32 subtype;
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_v2_oe_tlv_organizationid,
tvb,
PTP_V2_AN_TLV_OFFSET + tlv_total_length + PTP_V2_AN_TLV_OE_ORGANIZATIONID_OFFSET,
3,
ENC_BIG_ENDIAN);
org_id = tvb_get_ntoh24(tvb, PTP_V2_AN_TLV_OFFSET + tlv_total_length + PTP_V2_AN_TLV_OE_ORGANIZATIONID_OFFSET);
subtype = tvb_get_ntoh24(tvb, PTP_V2_AN_TLV_OFFSET + tlv_total_length + PTP_V2_AN_TLV_OE_ORGANIZATIONSUBTYPE_OFFSET);
switch (org_id)
{
case PTP_V2_OE_ORG_ID_IEEE_C37_238:
{
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_v2_oe_tlv_organizationsubtype,
tvb,
PTP_V2_AN_TLV_OFFSET + tlv_total_length + PTP_V2_AN_TLV_OE_ORGANIZATIONSUBTYPE_OFFSET,
3,
ENC_BIG_ENDIAN);
switch (subtype)
{
case PTP_V2_OE_ORG_IEEE_C37_238_SUBTYPE_C37238TLV:
{
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_v2_oe_tlv_subtype_c37238tlv_grandmasterid,
tvb,
PTP_V2_AN_TLV_OFFSET + tlv_total_length + PTP_V2_AN_TLV_OE_IEEEC37238TLV_GMID_OFFSET,
2,
ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_v2_oe_tlv_subtype_c37238tlv_grandmastertimeinaccuracy,
tvb,
PTP_V2_AN_TLV_OFFSET + tlv_total_length + PTP_V2_AN_TLV_OE_IEEEC37238TLV_GMINACCURACY_OFFSET,
4,
ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_v2_oe_tlv_subtype_c37238tlv_networktimeinaccuracy,
tvb,
PTP_V2_AN_TLV_OFFSET + tlv_total_length + PTP_V2_AN_TLV_OE_IEEEC37238TLV_NWINACCURACY_OFFSET,
4,
ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_v2_oe_tlv_subtype_c37238tlv_reserved,
tvb,
PTP_V2_AN_TLV_OFFSET + tlv_total_length + PTP_V2_AN_TLV_OE_IEEEC37238TLV_RESERVED_OFFSET,
2,
ENC_BIG_ENDIAN);
break;
}
default:
{
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_v2_oe_tlv_datafield,
tvb,
PTP_V2_AN_TLV_OFFSET + tlv_total_length + PTP_V2_AN_TLV_OE_DATAFIELD_OFFSET,
tlv_length - 6,
ENC_NA);
break;
}
}
break;
}
default:
{
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_v2_oe_tlv_organizationsubtype,
tvb,
PTP_V2_AN_TLV_OFFSET + tlv_total_length + PTP_V2_AN_TLV_OE_ORGANIZATIONSUBTYPE_OFFSET,
3,
ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_v2_oe_tlv_datafield,
tvb,
PTP_V2_AN_TLV_OFFSET + tlv_total_length + PTP_V2_AN_TLV_OE_DATAFIELD_OFFSET,
tlv_length - 6,
ENC_NA);
break;
}
}
break;
}
case PTP_V2_TLV_TYPE_ALTERNATE_TIME_OFFSET_INDICATOR:
{
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_v2_atoi_tlv_keyfield,
tvb,
PTP_V2_AN_TLV_OFFSET + tlv_total_length + PTP_V2_AN_TLV_ATOI_KEYFIELD_OFFSET,
1,
ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_v2_atoi_tlv_currentoffset,
tvb,
PTP_V2_AN_TLV_OFFSET + tlv_total_length + PTP_V2_AN_TLV_ATOI_CURRENTOFFSET_OFFSET,
4,
ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_v2_atoi_tlv_jumpseconds,
tvb,
PTP_V2_AN_TLV_OFFSET + tlv_total_length + PTP_V2_AN_TLV_ATOI_JUMPSECONDS_OFFSET,
4,
ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_v2_atoi_tlv_timeofnextjump,
tvb,
PTP_V2_AN_TLV_OFFSET + tlv_total_length + PTP_V2_AN_TLV_ATOI_TIMEOFNEXTJUMP_OFFSET,
6,
ENC_NA);
Offset = PTP_V2_AN_TLV_OFFSET + tlv_total_length + PTP_V2_AN_TLV_ATOI_DISPLAYNAME_OFFSET;
dissect_ptp_v2_text(tvb,
&Offset,
ptp_tlv_tree,
hf_ptp_v2_atoi_tlv_displayname,
hf_ptp_v2_atoi_tlv_displayname_length);
break;
}
case PTP_V2_TLV_TYPE_PATH_TRACE:
{
guint16 path_seq_total_length;
for(path_seq_total_length = 0; path_seq_total_length < tlv_length; path_seq_total_length+=8)
{
proto_tree_add_item(ptp_tlv_tree, hf_ptp_v2_an_tlv_pathsequence, tvb,
PTP_V2_AN_TLV_OFFSET + PTP_AS_AN_TLV_PATH_TRACE_OFFSET + path_seq_total_length,
8, ENC_BIG_ENDIAN);
}
break;
}
default:
{
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_v2_an_tlv_data,
tvb,
PTP_V2_AN_TLV_OFFSET + tlv_total_length + PTP_V2_AN_TLV_DATA_OFFSET,
tlv_length,
ENC_NA);
break;
}
}
tlv_total_length += (tlv_length + PTP_V2_AN_TLV_DATA_OFFSET);
}
}
break;
}
case PTP_V2_SYNC_MESSAGE:
case PTP_V2_DELAY_REQ_MESSAGE:{
proto_tree_add_item(ptp_tree, hf_ptp_v2_sdr_origintimestamp_seconds, tvb,
PTP_V2_SDR_ORIGINTIMESTAMPSECONDS_OFFSET, 6, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_v2_sdr_origintimestamp_nanoseconds, tvb,
PTP_V2_SDR_ORIGINTIMESTAMPNANOSECONDS_OFFSET, 4, ENC_BIG_ENDIAN);
break;
}
case PTP_V2_FOLLOWUP_MESSAGE:{
guint16 tlv_length;
proto_tree *ptp_tlv_tree;
proto_tree_add_item(ptp_tree, hf_ptp_v2_fu_preciseorigintimestamp_seconds, tvb,
PTP_V2_FU_PRECISEORIGINTIMESTAMPSECONDS_OFFSET, 6, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_v2_fu_preciseorigintimestamp_nanoseconds, tvb,
PTP_V2_FU_PRECISEORIGINTIMESTAMPNANOSECONDS_OFFSET, 4, ENC_BIG_ENDIAN);
/* In 802.1AS there is a Follow_UP information TLV in the Follow Up Message */
if(ptp_v2_transport_specific & PTP_V2_TRANSPORTSPECIFIC_ASPACKET_BITMASK){
/* There are TLV's to be processed */
tlv_length = tvb_get_ntohs (tvb, PTP_AS_FU_TLV_INFORMATION_OFFSET + PTP_AS_FU_TLV_LENGTHFIELD_OFFSET);
ptp_tlv_tree = proto_tree_add_subtree(
ptp_tree,
tvb,
PTP_AS_FU_TLV_INFORMATION_OFFSET,
tlv_length + PTP_AS_FU_TLV_ORGANIZATIONID_OFFSET,
ett_ptp_v2_tlv, NULL, "Follow Up information TLV");
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_as_fu_tlv_tlvtype,
tvb,
PTP_AS_FU_TLV_INFORMATION_OFFSET + PTP_AS_FU_TLV_TYPE_OFFSET,
2,
ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_as_fu_tlv_lengthfield,
tvb,
PTP_AS_FU_TLV_INFORMATION_OFFSET + PTP_AS_FU_TLV_LENGTHFIELD_OFFSET,
2,
ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_as_fu_tlv_organization_id,
tvb,
PTP_AS_FU_TLV_INFORMATION_OFFSET + PTP_AS_FU_TLV_ORGANIZATIONID_OFFSET,
3,
ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_as_fu_tlv_organization_subtype,
tvb,
PTP_AS_FU_TLV_INFORMATION_OFFSET + PTP_AS_FU_TLV_ORGANIZATIONSUBTYPE_OFFSET,
3,
ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_as_fu_tlv_cumulative_offset,
tvb,
PTP_AS_FU_TLV_INFORMATION_OFFSET + PTP_AS_FU_TLV_CUMULATIVESCALEDRATEOFFSET_OFFSET,
4,
ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_as_fu_tlv_gm_base_indicator,
tvb,
PTP_AS_FU_TLV_INFORMATION_OFFSET + PTP_AS_FU_TLV_GMTIMEBASEINDICATOR_OFFSET,
2,
ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_as_fu_tlv_last_gm_phase_change,
tvb,
PTP_AS_FU_TLV_INFORMATION_OFFSET + PTP_AS_FU_TLV_LASTGMPHASECHANGE_OFFSET,
12,
ENC_NA);
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_as_fu_tlv_scaled_last_gm_freq_change,
tvb,
PTP_AS_FU_TLV_INFORMATION_OFFSET + PTP_AS_FU_TLV_SCALEDLASTGMFREQCHANGE_OFFSET,
4,
ENC_BIG_ENDIAN);
}
break;
}
case PTP_V2_DELAY_RESP_MESSAGE:{
proto_tree_add_item(ptp_tree, hf_ptp_v2_dr_receivetimestamp_seconds, tvb,
PTP_V2_DR_RECEIVETIMESTAMPSECONDS_OFFSET, 6, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_v2_dr_receivetimestamp_nanoseconds, tvb,
PTP_V2_DR_RECEIVETIMESTAMPNANOSECONDS_OFFSET, 4, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_v2_dr_requestingportidentity, tvb,
PTP_V2_DR_REQUESTINGPORTIDENTITY_OFFSET, 8, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_v2_dr_requestingsourceportid, tvb,
PTP_V2_DR_REQUESTINGSOURCEPORTID_OFFSET, 2, ENC_BIG_ENDIAN);
break;
}
case PTP_V2_PATH_DELAY_REQ_MESSAGE:{
/* In 802.1AS there is no origin timestamp in a Pdelay_Req Message */
if(!(ptp_v2_transport_specific & PTP_V2_TRANSPORTSPECIFIC_ASPACKET_BITMASK)){
proto_tree_add_item(ptp_tree, hf_ptp_v2_pdrq_origintimestamp_seconds, tvb,
PTP_V2_PDRQ_ORIGINTIMESTAMPSECONDS_OFFSET, 6, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_v2_pdrq_origintimestamp_nanoseconds, tvb,
PTP_V2_PDRQ_ORIGINTIMESTAMPNANOSECONDS_OFFSET, 4, ENC_BIG_ENDIAN);
}
break;
}
case PTP_V2_PATH_DELAY_RESP_MESSAGE:{
proto_tree_add_item(ptp_tree, hf_ptp_v2_pdrs_requestreceipttimestamp_seconds, tvb,
PTP_V2_PDRS_REQUESTRECEIPTTIMESTAMPSECONDS_OFFSET, 6, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_v2_pdrs_requestreceipttimestamp_nanoseconds, tvb,
PTP_V2_PDRS_REQUESTRECEIPTTIMESTAMPNANOSECONDS_OFFSET, 4, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_v2_pdrs_requestingportidentity, tvb,
PTP_V2_PDRS_REQUESTINGPORTIDENTITY_OFFSET, 8, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_v2_pdrs_requestingsourceportid, tvb,
PTP_V2_PDRS_REQUESTINGSOURCEPORTID_OFFSET, 2, ENC_BIG_ENDIAN);
break;
}
case PTP_V2_PATH_DELAY_FOLLOWUP_MESSAGE:{
proto_tree_add_item(ptp_tree, hf_ptp_v2_pdfu_responseorigintimestamp_seconds, tvb,
PTP_V2_PDFU_RESPONSEORIGINTIMESTAMPSECONDS_OFFSET, 6, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_v2_pdfu_responseorigintimestamp_nanoseconds, tvb,
PTP_V2_PDFU_RESPONSEORIGINTIMESTAMPNANOSECONDS_OFFSET, 4, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_v2_pdfu_requestingportidentity, tvb,
PTP_V2_PDFU_REQUESTINGPORTIDENTITY_OFFSET, 8, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_v2_pdfu_requestingsourceportid, tvb,
PTP_V2_PDFU_REQUESTINGSOURCEPORTID_OFFSET, 2, ENC_BIG_ENDIAN);
break;
}
case PTP_V2_SIGNALLING_MESSAGE:{
guint16 tlv_length;
proto_item *tlv_ti, *sig_tlv_flags_ti;
proto_tree *ptp_tlv_tree, *sig_tlv_flags_tree;
proto_tree_add_item(ptp_tree, hf_ptp_v2_sig_targetportidentity, tvb,
PTP_V2_SIG_TARGETPORTIDENTITY_OFFSET, 8, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_v2_sig_targetportid, tvb,
PTP_V2_SIG_TARGETPORTID_OFFSET, 2, ENC_BIG_ENDIAN);
/* In 802.1AS there is a Message Interval Request TLV in the Signalling Message */
if(ptp_v2_transport_specific & PTP_V2_TRANSPORTSPECIFIC_ASPACKET_BITMASK){
/* There are TLV's to be processed */
tlv_length = tvb_get_ntohs (tvb, PTP_AS_SIG_TLV_MESSAGEINTERVALREQUEST_OFFSET + PTP_AS_SIG_TLV_LENGTHFIELD_OFFSET);
ptp_tlv_tree = proto_tree_add_subtree(
ptp_tree,
tvb,
PTP_AS_SIG_TLV_MESSAGEINTERVALREQUEST_OFFSET,
tlv_length + PTP_AS_SIG_TLV_ORGANIZATIONID_OFFSET,
ett_ptp_v2_tlv, NULL, "Message Interval Request TLV");
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_as_sig_tlv_tlvtype,
tvb,
PTP_AS_SIG_TLV_MESSAGEINTERVALREQUEST_OFFSET + PTP_AS_SIG_TLV_TYPE_OFFSET,
2,
ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_as_sig_tlv_lengthfield,
tvb,
PTP_AS_SIG_TLV_MESSAGEINTERVALREQUEST_OFFSET + PTP_AS_SIG_TLV_LENGTHFIELD_OFFSET,
2,
ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_as_sig_tlv_organization_id,
tvb,
PTP_AS_SIG_TLV_MESSAGEINTERVALREQUEST_OFFSET + PTP_AS_SIG_TLV_ORGANIZATIONID_OFFSET,
3,
ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_as_sig_tlv_organization_subtype,
tvb,
PTP_AS_SIG_TLV_MESSAGEINTERVALREQUEST_OFFSET + PTP_AS_SIG_TLV_ORGANIZATIONSUBTYPE_OFFSET,
3,
ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_as_sig_tlv_link_delay_interval,
tvb,
PTP_AS_SIG_TLV_MESSAGEINTERVALREQUEST_OFFSET + PTP_AS_SIG_TLV_LINKDELAYINTERVAL_OFFSET,
1,
ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_as_sig_tlv_time_sync_interval,
tvb,
PTP_AS_SIG_TLV_MESSAGEINTERVALREQUEST_OFFSET + PTP_AS_SIG_TLV_TIMESYNCINTERVAL_OFFSET,
1,
ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_as_sig_tlv_announce_interval,
tvb,
PTP_AS_SIG_TLV_MESSAGEINTERVALREQUEST_OFFSET + PTP_AS_SIG_TLV_ANNOUNCEINTERVAL_OFFSET,
1,
ENC_BIG_ENDIAN);
sig_tlv_flags_ti = proto_tree_add_item(ptp_tlv_tree,
hf_ptp_as_sig_tlv_flags,
tvb,
PTP_AS_SIG_TLV_MESSAGEINTERVALREQUEST_OFFSET + PTP_AS_SIG_TLV_FLAGS_OFFSET,
1,
ENC_BIG_ENDIAN);
sig_tlv_flags_tree = proto_item_add_subtree(sig_tlv_flags_ti, ett_ptp_as_sig_tlv_flags);
proto_tree_add_item(sig_tlv_flags_tree,
hf_ptp_as_sig_tlv_flags_comp_rate_ratio,
tvb,
PTP_AS_SIG_TLV_MESSAGEINTERVALREQUEST_OFFSET + PTP_AS_SIG_TLV_FLAGS_OFFSET,
1,
ENC_BIG_ENDIAN);
proto_tree_add_item(sig_tlv_flags_tree,
hf_ptp_as_sig_tlv_flags_comp_prop_delay,
tvb,
PTP_AS_SIG_TLV_MESSAGEINTERVALREQUEST_OFFSET + PTP_AS_SIG_TLV_FLAGS_OFFSET,
1,
ENC_BIG_ENDIAN);
} else {
guint proto_len;
guint32 tlv_offset;
guint16 tlv_type;
gint8 log_inter_message_period;
gdouble period = 0.0f;
gdouble rate = 0.0f;
guint32 duration_field;
proto_item *ptp_tlv_period;
proto_tree *ptp_tlv_period_tree;
proto_len = tvb_reported_length(tvb);
tlv_offset = PTP_V2_SIG_TLV_START;
while (tlv_offset < proto_len) {
/* 14.1.1 tlvType */
tlv_type = tvb_get_ntohs(tvb, tlv_offset + PTP_V2_SIG_TLV_TYPE_OFFSET);
tlv_ti = proto_tree_add_item(ptp_tree, hf_ptp_v2_sig_tlv_tlvType, tvb,
tlv_offset + PTP_V2_SIG_TLV_TYPE_OFFSET, PTP_V2_SIG_TLV_TYPE_LEN, ENC_BIG_ENDIAN);
ptp_tlv_tree = proto_item_add_subtree(tlv_ti, ett_ptp_v2_tlv);
/* 14.1.2 lengthField */
tlv_length = tvb_get_ntohs(tvb, tlv_offset + PTP_V2_SIG_TLV_LENGTH_OFFSET);
proto_tree_add_uint(ptp_tlv_tree, hf_ptp_v2_sig_tlv_lengthField, tvb,
tlv_offset + PTP_V2_SIG_TLV_LENGTH_OFFSET, PTP_V2_SIG_TLV_LENGTH_LEN, tlv_length);
switch (tlv_type) {
/* Request Unicast Transmission */
case PTP_V2_TLV_TYPE_REQUEST_UNICAST_TRANSMISSION:
/* 16.1.4.1.3 messageType */
proto_tree_add_item(ptp_tlv_tree, hf_ptp_v2_sig_tlv_messageType, tvb,
tlv_offset + PTP_V2_SIG_TLV_MESSAGE_TYPE_OFFSET, PTP_V2_SIG_TLV_MESSAGE_TYPE_LEN, ENC_BIG_ENDIAN);
/* 16.1.4.1.4 logInterMessagePeriod */
log_inter_message_period = tvb_get_guint8(tvb, tlv_offset + PTP_V2_SIG_TLV_LOG_INTER_MESSAGE_PERIOD_OFFSET);
period = pow(2, log_inter_message_period);
rate = 1/period;
ptp_tlv_period = proto_tree_add_item(ptp_tlv_tree, hf_ptp_v2_sig_tlv_logInterMessagePeriod, tvb,
tlv_offset + PTP_V2_SIG_TLV_LOG_INTER_MESSAGE_PERIOD_OFFSET, PTP_V2_SIG_TLV_LOG_INTER_MESSAGE_PERIOD_LEN, ENC_BIG_ENDIAN);
ptp_tlv_period_tree = proto_item_add_subtree(ptp_tlv_period, ett_ptp_v2_tlv_log_period);
proto_tree_add_int_format_value(ptp_tlv_period_tree, hf_ptp_v2_sig_tlv_logInterMessagePeriod_period, tvb,
tlv_offset + PTP_V2_SIG_TLV_LOG_INTER_MESSAGE_PERIOD_OFFSET, PTP_V2_SIG_TLV_LOG_INTER_MESSAGE_PERIOD_LEN, log_inter_message_period, "every %lg seconds", period);
proto_tree_add_int_format_value(ptp_tlv_period_tree, hf_ptp_v2_sig_tlv_logInterMessagePeriod_rate, tvb,
tlv_offset + PTP_V2_SIG_TLV_LOG_INTER_MESSAGE_PERIOD_OFFSET, PTP_V2_SIG_TLV_LOG_INTER_MESSAGE_PERIOD_LEN, log_inter_message_period, "%lg packets/sec", rate);
/* 16.1.4.1.5 durationField */
duration_field = tvb_get_ntohl(tvb, tlv_offset + PTP_V2_SIG_TLV_DURATION_FIELD_OFFSET);
proto_tree_add_uint_format_value(ptp_tlv_tree, hf_ptp_v2_sig_tlv_durationField, tvb,
tlv_offset + PTP_V2_SIG_TLV_DURATION_FIELD_OFFSET, PTP_V2_SIG_TLV_DURATION_FIELD_LEN, duration_field, "%u seconds", duration_field);
break;
/* Grant Unicast Transmission */
case PTP_V2_TLV_TYPE_GRANT_UNICAST_TRANSMISSION:
/* 16.1.4.2.3 messageType */
proto_tree_add_item(ptp_tlv_tree, hf_ptp_v2_sig_tlv_messageType, tvb,
tlv_offset + PTP_V2_SIG_TLV_MESSAGE_TYPE_OFFSET, PTP_V2_SIG_TLV_MESSAGE_TYPE_LEN, ENC_BIG_ENDIAN);
/* 16.1.4.2.4 logInterMessagePeriod */
log_inter_message_period = tvb_get_guint8(tvb, tlv_offset + PTP_V2_SIG_TLV_LOG_INTER_MESSAGE_PERIOD_OFFSET);
period = pow(2, log_inter_message_period);
rate = 1/period;
ptp_tlv_period = proto_tree_add_item(ptp_tlv_tree, hf_ptp_v2_sig_tlv_logInterMessagePeriod, tvb,
tlv_offset + PTP_V2_SIG_TLV_LOG_INTER_MESSAGE_PERIOD_OFFSET, PTP_V2_SIG_TLV_LOG_INTER_MESSAGE_PERIOD_LEN, ENC_BIG_ENDIAN);
ptp_tlv_period_tree = proto_item_add_subtree(ptp_tlv_period, ett_ptp_v2_tlv_log_period);
proto_tree_add_int_format_value(ptp_tlv_period_tree, hf_ptp_v2_sig_tlv_logInterMessagePeriod_period, tvb,
tlv_offset + PTP_V2_SIG_TLV_LOG_INTER_MESSAGE_PERIOD_OFFSET, PTP_V2_SIG_TLV_LOG_INTER_MESSAGE_PERIOD_LEN, log_inter_message_period, "every %lg seconds", period);
proto_tree_add_int_format_value(ptp_tlv_period_tree, hf_ptp_v2_sig_tlv_logInterMessagePeriod_rate, tvb,
tlv_offset + PTP_V2_SIG_TLV_LOG_INTER_MESSAGE_PERIOD_OFFSET, PTP_V2_SIG_TLV_LOG_INTER_MESSAGE_PERIOD_LEN, log_inter_message_period, "%lg packets/sec", rate);
/* 16.1.4.2.5 durationField */
duration_field = tvb_get_ntohl(tvb, tlv_offset + PTP_V2_SIG_TLV_DURATION_FIELD_OFFSET);
proto_tree_add_uint_format_value(ptp_tlv_tree, hf_ptp_v2_sig_tlv_durationField, tvb,
tlv_offset + PTP_V2_SIG_TLV_DURATION_FIELD_OFFSET, PTP_V2_SIG_TLV_DURATION_FIELD_LEN, duration_field, "%u seconds", duration_field);
/* 16.1.4.2.6 renewalInvited */
proto_tree_add_item(ptp_tlv_tree, hf_ptp_v2_sig_tlv_renewalInvited, tvb,
tlv_offset + PTP_V2_SIG_TLV_RENEWAL_INVITED_OFFSET, PTP_V2_SIG_TLV_RENEWAL_INVITED_LEN, ENC_BIG_ENDIAN);
break;
/* Cancel Unicast Transmission */
case PTP_V2_TLV_TYPE_CANCEL_UNICAST_TRANSMISSION:
/* 16.1.4.3.3 messageType */
proto_tree_add_item(ptp_tlv_tree, hf_ptp_v2_sig_tlv_messageType, tvb,
tlv_offset + PTP_V2_SIG_TLV_MESSAGE_TYPE_OFFSET, PTP_V2_SIG_TLV_MESSAGE_TYPE_LEN, ENC_BIG_ENDIAN);
break;
/* Acknowledge Cancel Unicast Transmission */
case PTP_V2_TLV_TYPE_ACKNOWLEDGE_CANCEL_UNICAST_TRANSMISSION:
/* 16.1.4.4.3 messageType */
proto_tree_add_item(ptp_tlv_tree, hf_ptp_v2_sig_tlv_messageType, tvb,
tlv_offset + PTP_V2_SIG_TLV_MESSAGE_TYPE_OFFSET, PTP_V2_SIG_TLV_MESSAGE_TYPE_LEN, ENC_BIG_ENDIAN);
break;
default:
/* TODO: Add dissector for other TLVs */
proto_tree_add_item(ptp_tlv_tree, hf_ptp_v2_sig_tlv_data, tvb,
tlv_offset + PTP_V2_SIG_TLV_VALUE_OFFSET, tlv_length, ENC_NA);
}
tlv_offset += PTP_V2_SIG_TLV_TYPE_LEN +
PTP_V2_SIG_TLV_LENGTH_LEN +
tlv_length;
}
}
break;
}
case PTP_V2_MANAGEMENT_MESSAGE:
{
guint16 tlv_type, tlv_length;
proto_tree_add_item(ptp_tree, hf_ptp_v2_mm_targetportidentity, tvb,
PTP_V2_MM_TARGETPORTIDENTITY_OFFSET, 8, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_v2_mm_targetportid, tvb,
PTP_V2_MM_TARGETPORTID_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_v2_mm_startingboundaryhops, tvb,
PTP_V2_MM_STARTINGBOUNDARYHOPS_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_v2_mm_boundaryhops, tvb,
PTP_V2_MM_BOUNDARYHOPS_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_v2_mm_action, tvb,
PTP_V2_MM_ACTION_OFFSET, 1, ENC_BIG_ENDIAN);
/* management TLV */
proto_tree_add_item(ptp_tree, hf_ptp_v2_mm_tlvType, tvb,
PTP_V2_MM_TLV_TYPE_OFFSET, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_tree, hf_ptp_v2_mm_lengthField, tvb,
PTP_V2_MM_TLV_LENGTHFIELD_OFFSET, 2, ENC_BIG_ENDIAN);
tlv_type = tvb_get_ntohs (tvb, PTP_V2_MM_TLV_TYPE_OFFSET);
tlv_length = tvb_get_ntohs (tvb, PTP_V2_MM_TLV_LENGTHFIELD_OFFSET);
/* For management there are PTP_V2_TLV_TYPE_MANAGEMENT and PTP_V2_TLV_TYPE_MANAGEMENT_ERROR_STATUS TLVs */
switch(tlv_type) {
case PTP_V2_TLV_TYPE_MANAGEMENT:
{
guint16 ptp_v2_managementId;
guint16 Offset = PTP_V2_MM_TLV_DATAFIELD_OFFSET;
proto_tree_add_item(ptp_tree, hf_ptp_v2_mm_managementId, tvb,
PTP_V2_MM_TLV_MANAGEMENTID_OFFSET, 2, ENC_BIG_ENDIAN);
ptp_v2_managementId = tvb_get_ntohs (tvb, PTP_V2_MM_TLV_MANAGEMENTID_OFFSET);
if (tlv_length <= 2)
{
/* no data */
break;
}
managementData_ti = proto_tree_add_item(ptp_tree, hf_ptp_v2_mm_data, tvb, Offset, tlv_length - 2, ENC_NA);
/* data field of the management message (subtree) */
ptp_managementData_tree = proto_item_add_subtree(managementData_ti, ett_ptp_v2_managementData);
switch(ptp_v2_managementId) {
case PTP_V2_MM_ID_NULL_MANAGEMENT:
{
/* no data in NULL management */
break;
}
case PTP_V2_MM_ID_CLOCK_DESCRIPTION:
{
guint16 N = 0, S = 0;
clockType_ti = proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_clockType, tvb,
Offset, 2, ENC_BIG_ENDIAN);
ptp_clockType_tree = proto_item_add_subtree(clockType_ti, ett_ptp_v2_clockType);
/* ClockType Subtree */
proto_tree_add_item(ptp_clockType_tree, hf_ptp_v2_mm_clockType_ordinaryClock, tvb,
Offset, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_clockType_tree, hf_ptp_v2_mm_clockType_boundaryClock, tvb,
Offset, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_clockType_tree, hf_ptp_v2_mm_clockType_p2p_transparentClock, tvb,
Offset, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_clockType_tree, hf_ptp_v2_mm_clockType_e2e_transparentClock, tvb,
Offset, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_clockType_tree, hf_ptp_v2_mm_clockType_managementNode, tvb,
Offset, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_clockType_tree, hf_ptp_v2_mm_clockType_reserved, tvb,
Offset, 2, ENC_BIG_ENDIAN);
Offset +=2;
dissect_ptp_v2_text (tvb, &Offset, ptp_managementData_tree,
hf_ptp_v2_mm_physicalLayerProtocol, hf_ptp_v2_mm_physicalLayerProtocol_length);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_physicalAddressLength, tvb,
Offset, 2, ENC_BIG_ENDIAN);
S = tvb_get_ntohs (tvb, Offset);
Offset +=2;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_physicalAddress, tvb,
Offset, S, ENC_NA);
Offset += S;
N = tvb_get_ntohs (tvb, Offset+2);
protocolAddress_ti = proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_protocolAddress, tvb,
Offset+4, N, ENC_NA);
ptp_protocolAddress_tree = proto_item_add_subtree(protocolAddress_ti, ett_ptp_v2_protocolAddress);
/* physicalLayerProtocol subtree */
proto_tree_add_item(ptp_protocolAddress_tree, hf_ptp_v2_mm_protocolAddress_networkProtocol, tvb,
Offset, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_protocolAddress_tree, hf_ptp_v2_mm_protocolAddress_length, tvb,
Offset+2, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_protocolAddress_tree, hf_ptp_v2_mm_protocolAddress, tvb,
Offset+4, N, ENC_NA);
N = N + 4;
Offset += N;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_manufacturerIdentity, tvb,
Offset, 3, ENC_NA);
Offset += 3;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_reserved, tvb,
Offset, 1, ENC_NA);
Offset += 1;
dissect_ptp_v2_text (tvb, &Offset, ptp_managementData_tree,
hf_ptp_v2_mm_productDescription, hf_ptp_v2_mm_productDescription_length);
dissect_ptp_v2_text (tvb, &Offset, ptp_managementData_tree,
hf_ptp_v2_mm_revisionData, hf_ptp_v2_mm_revisionData_length);
dissect_ptp_v2_text (tvb, &Offset, ptp_managementData_tree,
hf_ptp_v2_mm_userDescription, hf_ptp_v2_mm_userDescription_length);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_profileIdentity, tvb,
Offset, 6, ENC_NA);
Offset += 6;
/* Wenn Offset nicht gerade folgt noch ein pad Bit */
if ( (Offset - PTP_V2_MM_TLV_DATAFIELD_OFFSET) % 2 )
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_pad, tvb,
Offset, 1, ENC_NA);
}
break;
}
case PTP_V2_MM_ID_USER_DESCRIPTION:
{
dissect_ptp_v2_text (tvb, &Offset, ptp_managementData_tree,
hf_ptp_v2_mm_userDescription, hf_ptp_v2_mm_userDescription_length);
/* Wenn Offset nicht gerade folgt noch ein pad Bit */
if ( (Offset - PTP_V2_MM_TLV_DATAFIELD_OFFSET) % 2 )
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_pad, tvb,
Offset, 1, ENC_NA);
}
break;
}
case PTP_V2_MM_ID_SAVE_IN_NON_VOLATILE_STORAGE:
{
/* no data */
break;
}
case PTP_V2_MM_ID_RESET_NON_VOLATILE_STORAGE:
{
/* no data */
break;
}
case PTP_V2_MM_ID_INITIALIZE:
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_initializationKey, tvb,
Offset, 2, ENC_BIG_ENDIAN);
break;
}
case PTP_V2_MM_ID_FAULT_LOG:
{
guint16 ii, num = 0;
proto_tree *ptpError_subtree;
num = tvb_get_ntohs (tvb, Offset);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_numberOfFaultRecords, tvb,
Offset, 2, ENC_BIG_ENDIAN);
Offset +=2;
for (ii = 0; ii < num; ii++)
{
ptpError_subtree = proto_tree_add_subtree(ptp_managementData_tree, tvb, Offset, tvb_get_ntohs (tvb, Offset),
ett_ptp_v2_faultRecord, NULL, "Fault record");
proto_tree_add_item(ptpError_subtree, hf_ptp_v2_mm_faultRecordLength, tvb,
Offset, 2, ENC_BIG_ENDIAN);
Offset +=2;
proto_tree_add_item(ptpError_subtree, hf_ptp_v2_mm_faultTime_s, tvb,
Offset, 6, ENC_BIG_ENDIAN);
Offset +=6;
proto_tree_add_item(ptpError_subtree, hf_ptp_v2_mm_faultTime_ns, tvb,
Offset, 4, ENC_BIG_ENDIAN);
Offset +=4;
proto_tree_add_item(ptpError_subtree, hf_ptp_v2_mm_severityCode, tvb,
Offset, 1, ENC_BIG_ENDIAN);
Offset +=1;
dissect_ptp_v2_text (tvb, &Offset, ptpError_subtree,
hf_ptp_v2_mm_faultName, hf_ptp_v2_mm_faultName_length);
dissect_ptp_v2_text (tvb, &Offset, ptpError_subtree,
hf_ptp_v2_mm_faultValue, hf_ptp_v2_mm_faultValue_length);
dissect_ptp_v2_text (tvb, &Offset, ptpError_subtree,
hf_ptp_v2_mm_faultDescription, hf_ptp_v2_mm_faultDescription_length);
}
/* Wenn Offset nicht gerade folgt noch ein pad Bit */
if ( (Offset - PTP_V2_MM_TLV_DATAFIELD_OFFSET) % 2 )
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_pad, tvb,
Offset, 1, ENC_NA);
}
break;
}
case PTP_V2_MM_ID_FAULT_LOG_RESET:
{
/* no data */
break;
}
case PTP_V2_MM_ID_DEFAULT_DATA_SET:
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_TSC, tvb,
PTP_V2_MM_TLV_DATAFIELD_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_dds_SO, tvb,
PTP_V2_MM_TLV_DATAFIELD_OFFSET, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_reserved, tvb,
PTP_V2_MM_RESERVED1, 1, ENC_NA);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_numberPorts, tvb,
PTP_V2_MM_NUMBERPORTS, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_priority1, tvb,
PTP_V2_MM_PRIORITY1, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_clockclass, tvb,
PTP_V2_MM_CLOCKQUALITY, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_clockaccuracy, tvb,
PTP_V2_MM_CLOCKQUALITY+1, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_clockvariance, tvb,
PTP_V2_MM_CLOCKQUALITY+2, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_priority2, tvb,
PTP_V2_MM_PRIORITY2, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_clockidentity, tvb,
PTP_V2_MM_CLOCKIDENTITY, 8, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_domainNumber, tvb,
PTP_V2_MM_DOMAINNUMBER, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_reserved, tvb,
PTP_V2_MM_RESERVED2, 1, ENC_NA);
break;
}
case PTP_V2_MM_ID_CURRENT_DATA_SET:
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_stepsRemoved, tvb,
Offset, 2, ENC_BIG_ENDIAN);
Offset +=2;
dissect_ptp_v2_timeInterval(tvb, &Offset, ptp_managementData_tree,
"Offset from Master", hf_ptp_v2_mm_offset_ns, hf_ptp_v2_mm_offset_subns);
dissect_ptp_v2_timeInterval(tvb, &Offset, ptp_managementData_tree,
"Mean path delay", hf_ptp_v2_mm_pathDelay_ns, hf_ptp_v2_mm_pathDelay_subns);
break;
}
case PTP_V2_MM_ID_PARENT_DATA_SET:
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_parentIdentity, tvb,
Offset, 8, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_parentPort, tvb,
Offset+8, 2, ENC_BIG_ENDIAN);
Offset +=10;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_parentStats, tvb,
Offset, 1, ENC_BIG_ENDIAN);
Offset +=1;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_reserved, tvb,
Offset, 1, ENC_NA);
Offset +=1;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_observedParentOffsetScaledLogVariance, tvb,
Offset, 2, ENC_BIG_ENDIAN);
Offset +=2;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_observedParentClockPhaseChangeRate, tvb,
Offset, 4, ENC_BIG_ENDIAN);
Offset +=4;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_grandmasterPriority1, tvb,
Offset, 1, ENC_BIG_ENDIAN);
Offset +=1;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_grandmasterclockclass, tvb,
Offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_grandmasterclockaccuracy, tvb,
Offset+1, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_grandmasterclockvariance, tvb,
Offset+2, 2, ENC_BIG_ENDIAN);
Offset += 4;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_grandmasterPriority2, tvb,
Offset, 1, ENC_BIG_ENDIAN);
Offset +=1;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_grandmasterIdentity, tvb,
Offset, 8, ENC_BIG_ENDIAN);
break;
}
case PTP_V2_MM_ID_TIME_PROPERTIES_DATA_SET:
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_currentUtcOffset, tvb,
Offset, 2, ENC_BIG_ENDIAN);
Offset +=2;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_LI_61, tvb,
Offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_LI_59, tvb,
Offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_UTCV, tvb,
Offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_PTP, tvb,
Offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_TTRA, tvb,
Offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_FTRA, tvb,
Offset, 1, ENC_BIG_ENDIAN);
Offset +=1;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_timesource, tvb,
Offset, 1, ENC_BIG_ENDIAN);
break;
}
case PTP_V2_MM_ID_PORT_DATA_SET:
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_clockidentity, tvb,
Offset, 8, ENC_BIG_ENDIAN);
Offset +=8;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_PortNumber, tvb,
Offset, 2, ENC_BIG_ENDIAN);
Offset +=2;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_portState, tvb,
Offset, 1, ENC_BIG_ENDIAN);
Offset +=1;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_logMinDelayReqInterval, tvb,
Offset, 1, ENC_BIG_ENDIAN);
Offset +=1;
dissect_ptp_v2_timeInterval(tvb, &Offset, ptp_managementData_tree,
"Peer mean path delay", hf_ptp_v2_mm_peerMeanPathDelay_ns, hf_ptp_v2_mm_peerMeanPathDelay_subns);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_logAnnounceInterval, tvb,
Offset, 1, ENC_BIG_ENDIAN);
Offset +=1;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_announceReceiptTimeout, tvb,
Offset, 1, ENC_BIG_ENDIAN);
Offset +=1;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_logSyncInterval, tvb,
Offset, 1, ENC_BIG_ENDIAN);
Offset +=1;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_delayMechanism, tvb,
Offset, 1, ENC_BIG_ENDIAN);
Offset +=1;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_logMinPdelayReqInterval, tvb,
Offset, 1, ENC_BIG_ENDIAN);
Offset +=1;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_versionNumber, tvb,
Offset, 1, ENC_BIG_ENDIAN);
Offset +=1;
break;
}
case PTP_V2_MM_ID_PRIORITY1:
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_priority1, tvb,
Offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_reserved, tvb,
Offset+1, 1, ENC_NA);
break;
}
case PTP_V2_MM_ID_PRIORITY2:
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_priority2, tvb,
Offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_reserved, tvb,
Offset+1, 1, ENC_NA);
break;
}
case PTP_V2_MM_ID_DOMAIN:
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_domainNumber, tvb,
Offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_reserved, tvb,
Offset+1, 1, ENC_NA);
break;
}
case PTP_V2_MM_ID_SLAVE_ONLY:
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_SO, tvb,
Offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_reserved, tvb,
Offset+1, 1, ENC_NA);
break;
}
case PTP_V2_MM_ID_LOG_ANNOUNCE_INTERVAL:
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_logAnnounceInterval, tvb,
Offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_reserved, tvb,
Offset+1, 1, ENC_NA);
break;
}
case PTP_V2_MM_ID_ANNOUNCE_RECEIPT_TIMEOUT:
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_announceReceiptTimeout, tvb,
Offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_reserved, tvb,
Offset+1, 1, ENC_NA);
break;
}
case PTP_V2_MM_ID_LOG_SYNC_INTERVAL:
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_logSyncInterval, tvb,
Offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_reserved, tvb,
Offset+1, 1, ENC_NA);
break;
}
case PTP_V2_MM_ID_VERSION_NUMBER:
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_versionNumber, tvb,
Offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_reserved, tvb,
Offset+1, 1, ENC_NA);
break;
}
case PTP_V2_MM_ID_ENABLE_PORT:
{
/* no data */
break;
}
case PTP_V2_MM_ID_DISABLE_PORT:
{
/* no data */
break;
}
case PTP_V2_MM_ID_TIME:
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_currentTime_s, tvb,
Offset, 6, ENC_BIG_ENDIAN);
Offset +=6;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_currentTime_ns, tvb,
Offset, 4, ENC_BIG_ENDIAN);
break;
}
case PTP_V2_MM_ID_CLOCK_ACCURACY:
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_clockAccuracy, tvb,
Offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_reserved, tvb,
Offset+1, 1, ENC_NA);
break;
}
case PTP_V2_MM_ID_UTC_PROPERTIES:
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_currentUtcOffset, tvb,
Offset, 2, ENC_BIG_ENDIAN);
Offset +=2;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_LI_61, tvb,
Offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_LI_59, tvb,
Offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_UTCV, tvb,
Offset, 1, ENC_BIG_ENDIAN);
Offset +=1;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_reserved, tvb,
Offset, 1, ENC_NA);
break;
}
case PTP_V2_MM_ID_TRACEABILITY_PROPERTIES:
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_TTRA, tvb,
Offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_FTRA, tvb,
Offset, 1, ENC_BIG_ENDIAN);
Offset +=1;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_reserved, tvb,
Offset, 1, ENC_NA);
break;
}
case PTP_V2_MM_ID_TIMESCALE_PROPERTIES:
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_PTP, tvb,
Offset, 1, ENC_BIG_ENDIAN);
Offset +=1;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_timesource, tvb,
Offset, 1, ENC_BIG_ENDIAN);
break;
}
case PTP_V2_MM_ID_UNICAST_NEGOTIATION_ENABLE:
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_ucEN, tvb,
Offset, 1, ENC_BIG_ENDIAN);
Offset +=1;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_reserved, tvb,
Offset, 1, ENC_NA);
break;
}
case PTP_V2_MM_ID_PATH_TRACE_LIST:
{
guint16 i = 0;
/* one or more ClockIdentity */
for (i = 0; i < (tlv_length / 8); i++)
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_clockidentity, tvb,
Offset, 8, ENC_BIG_ENDIAN);
}
break;
}
case PTP_V2_MM_ID_PATH_TRACE_ENABLE:
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_ptEN, tvb,
Offset, 1, ENC_BIG_ENDIAN);
Offset +=1;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_reserved, tvb,
Offset, 1, ENC_NA);
break;
}
case PTP_V2_MM_ID_GRANDMASTER_CLUSTER_TABLE:
{
/* ToDo */
break;
}
case PTP_V2_MM_ID_UNICAST_MASTER_TABLE:
{
/* ToDo */
break;
}
case PTP_V2_MM_ID_UNICAST_MASTER_MAX_TABLE_SIZE:
{
/* ToDo */
break;
}
case PTP_V2_MM_ID_ACCEPTABLE_MASTER_TABLE:
{
/* ToDo */
break;
}
case PTP_V2_MM_ID_ACCEPTABLE_MASTER_TABLE_ENABLED:
{
/* ToDo */
break;
}
case PTP_V2_MM_ID_ACCEPTABLE_MASTER_MAX_TABLE_SIZE:
{
/* ToDo */
break;
}
case PTP_V2_MM_ID_ALTERNATE_TIME_OFFSET_ENABLE:
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_keyField, tvb,
Offset, 1, ENC_BIG_ENDIAN);
Offset +=1;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_atEN, tvb,
Offset, 1, ENC_BIG_ENDIAN);
Offset +=1;
break;
}
case PTP_V2_MM_ID_ALTERNATE_TIME_OFFSET_NAME:
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_keyField, tvb,
Offset, 1, ENC_BIG_ENDIAN);
Offset +=1;
dissect_ptp_v2_text (tvb, &Offset, ptp_managementData_tree,
hf_ptp_v2_mm_displayName, hf_ptp_v2_mm_displayName_length);
/* Wenn Offset nicht gerade folgt noch ein pad Bit */
if ( (Offset - PTP_V2_MM_TLV_DATAFIELD_OFFSET) % 2 )
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_pad, tvb,
Offset, 1, ENC_NA);
}
break;
}
case PTP_V2_MM_ID_ALTERNATE_TIME_OFFSET_MAX_KEY:
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_maxKey, tvb,
Offset, 1, ENC_BIG_ENDIAN);
Offset +=1;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_reserved, tvb,
Offset, 1, ENC_NA);
break;
}
case PTP_V2_MM_ID_ALTERNATE_MASTER:
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_transmitAlternateMulticastSync, tvb,
Offset, 1, ENC_BIG_ENDIAN);
Offset +=1;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_numberOfAlternateMasters, tvb,
Offset, 1, ENC_BIG_ENDIAN);
Offset +=1;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_logAlternateMulticastSyncInterval, tvb,
Offset, 1, ENC_BIG_ENDIAN);
Offset +=1;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_reserved, tvb,
Offset, 1, ENC_NA);
break;
}
case PTP_V2_MM_ID_ALTERNATE_TIME_OFFSET_PROPERTIES:
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_keyField, tvb,
Offset, 1, ENC_BIG_ENDIAN);
Offset +=1;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_currentOffset, tvb,
Offset, 4, ENC_BIG_ENDIAN);
Offset +=4;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_jumpSeconds, tvb,
Offset, 4, ENC_BIG_ENDIAN);
Offset +=4;
timeStamp = tvb_get_ntohl(tvb, Offset);
timeStamp = timeStamp << 16;
timeStamp = timeStamp | tvb_get_ntohs(tvb, Offset+4);
proto_tree_add_uint64(ptp_managementData_tree, hf_ptp_v2_mm_nextjumpSeconds, tvb,
Offset, 6, timeStamp);
Offset +=6;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_reserved, tvb,
Offset, 1, ENC_NA);
break;
}
case PTP_V2_MM_ID_TC_DEFAULT_DATA_SET:
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_clockidentity, tvb,
Offset, 8, ENC_BIG_ENDIAN);
Offset +=8;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_numberPorts, tvb,
Offset, 2, ENC_BIG_ENDIAN);
Offset +=2;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_delayMechanism, tvb,
Offset, 1, ENC_BIG_ENDIAN);
Offset +=1;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_primaryDomain, tvb,
Offset, 1, ENC_BIG_ENDIAN);
break;
}
case PTP_V2_MM_ID_TC_PORT_DATA_SET:
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_clockidentity, tvb,
Offset, 8, ENC_BIG_ENDIAN);
Offset +=8;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_PortNumber, tvb,
Offset, 2, ENC_BIG_ENDIAN);
Offset +=2;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_faultyFlag, tvb,
Offset, 1, ENC_BIG_ENDIAN);
Offset +=1;
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_logMinPdelayReqInterval, tvb,
Offset, 1, ENC_BIG_ENDIAN);
Offset +=1;
dissect_ptp_v2_timeInterval(tvb, &Offset, ptp_managementData_tree,
"Peer mean path delay", hf_ptp_v2_mm_peerMeanPathDelay_ns, hf_ptp_v2_mm_peerMeanPathDelay_subns);
break;
}
case PTP_V2_MM_ID_PRIMARY_DOMAIN:
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_primaryDomain, tvb,
Offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_reserved, tvb,
Offset+1, 1, ENC_NA);
break;
}
case PTP_V2_MM_ID_DELAY_MECHANISM:
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_delayMechanism, tvb,
Offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_reserved, tvb,
Offset+1, 1, ENC_NA);
break;
}
case PTP_V2_MM_ID_LOG_MIN_PDELAY_REQ_INTERVAL:
{
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_logMinPdelayReqInterval, tvb,
Offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_managementData_tree, hf_ptp_v2_mm_reserved, tvb,
Offset+1, 1, ENC_NA);
break;
}
default:
{
/* no data */
break;
}
} /* switch(ptp_v2_managementId) */
break;
}
case PTP_V2_TLV_TYPE_MANAGEMENT_ERROR_STATUS:
{
/* there is only one error TLV */
guint16 Offset = PTP_V2_MM_TLV_MANAGEMENTERRORID_OFFSET;
proto_tree_add_item(ptp_tree, hf_ptp_v2_mm_managementErrorId, tvb,
Offset, 2, ENC_BIG_ENDIAN);
Offset +=2;
proto_tree_add_item(ptp_tree, hf_ptp_v2_mm_managementId, tvb,
Offset, 2, ENC_BIG_ENDIAN);
Offset +=2;
proto_tree_add_item(ptp_tree, hf_ptp_v2_mm_reserved, tvb,
Offset, 4, ENC_NA);
Offset +=4;
/* optional Field! */
if (Offset - PTP_V2_MM_TLV_MANAGEMENTERRORID_OFFSET + 2 < tlv_length)
{
dissect_ptp_v2_text (tvb, &Offset, ptp_tree,
hf_ptp_v2_mm_displayData, hf_ptp_v2_mm_displayData_length);
}
/* Wenn Offset nicht gerade folgt noch ein pad Bit */
if ( (Offset - PTP_V2_MM_TLV_MANAGEMENTERRORID_OFFSET) % 2 )
{
proto_tree_add_item(ptp_tree, hf_ptp_v2_mm_pad, tvb,
Offset, 1, ENC_NA);
}
break;
}
case PTP_V2_TLV_TYPE_ORGANIZATION_EXTENSION:
{
guint32 org_id;
guint32 subtype;
proto_item *smptedata_ti, *systemframerate_ti, *timeaddressflags_ti, *daylightsavingflags_ti, *leapsecondjumpflags_ti;
proto_tree *ptp_smptedata_tree, *ptp_framerate_tree, *ptp_timeaddress_tree, *ptp_daylightsaving_tree, *ptp_leapsecondjump_tree;
guint16 Offset = PTP_V2_MM_TLV_LENGTHFIELD_OFFSET + 2;
proto_tree_add_item(ptp_tree, hf_ptp_v2_oe_tlv_organizationid,
tvb, Offset, 3, ENC_BIG_ENDIAN);
org_id = tvb_get_ntoh24(tvb, Offset);
Offset += 3;
switch (org_id)
{
case PTP_v2_OE_ORG_ID_SMPTE:
{
proto_tree_add_item(ptp_tree, hf_ptp_v2_oe_tlv_smpte_subtype,
tvb, Offset, 3, ENC_BIG_ENDIAN);
subtype = tvb_get_ntoh24(tvb, Offset);
Offset += 3;
switch (subtype)
{
case PTP_V2_OE_ORG_SMPTE_SUBTYPE_VERSION_TLV:
{
smptedata_ti = proto_tree_add_item(ptp_tree,
hf_ptp_v2_oe_tlv_subtype_smpte_data, tvb, Offset, 42, ENC_NA);
ptp_smptedata_tree = proto_item_add_subtree(smptedata_ti, ett_ptp_oe_smpte_data);
systemframerate_ti = proto_tree_add_item(ptp_smptedata_tree,
hf_ptp_v2_oe_tlv_subtype_smpte_defaultsystemframerate, tvb, Offset, 8, ENC_NA);
ptp_framerate_tree = proto_item_add_subtree(systemframerate_ti, ett_ptp_oe_smpte_framerate);
proto_tree_add_item(ptp_framerate_tree,
hf_ptp_v2_oe_tlv_subtype_smpte_defaultsystemframerate_numerator, tvb, Offset, 4, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_framerate_tree,
hf_ptp_v2_oe_tlv_subtype_smpte_defaultsystemframerate_denominator, tvb, Offset+4, 4, ENC_BIG_ENDIAN);
Offset += 8;
proto_tree_add_item(ptp_smptedata_tree, hf_ptp_v2_oe_tlv_subtype_smpte_masterlockingstatus,
tvb, Offset, 1, ENC_BIG_ENDIAN);
Offset += 1;
timeaddressflags_ti = proto_tree_add_item(ptp_smptedata_tree,
hf_ptp_v2_oe_tlv_subtype_smpte_timeaddressflags, tvb, Offset, 1, ENC_NA);
ptp_timeaddress_tree = proto_item_add_subtree(timeaddressflags_ti, ett_ptp_oe_smpte_timeaddress);
proto_tree_add_item(ptp_timeaddress_tree,
hf_ptp_v2_oe_tlv_subtype_smpte_timeaddressflags_drop, tvb, Offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_timeaddress_tree,
hf_ptp_v2_oe_tlv_subtype_smpte_timeaddressflags_color, tvb, Offset, 1, ENC_BIG_ENDIAN);
Offset += 1;
proto_tree_add_item(ptp_smptedata_tree, hf_ptp_v2_oe_tlv_subtype_smpte_currentlocaloffset,
tvb, Offset, 4, ENC_BIG_ENDIAN);
Offset += 4;
proto_tree_add_item(ptp_smptedata_tree, hf_ptp_v2_oe_tlv_subtype_smpte_jumpseconds,
tvb, Offset, 4, ENC_BIG_ENDIAN);
Offset += 4;
proto_tree_add_item(ptp_smptedata_tree, hf_ptp_v2_oe_tlv_subtype_smpte_timeofnextjump,
tvb, Offset, 6, ENC_BIG_ENDIAN);
Offset += 6;
proto_tree_add_item(ptp_smptedata_tree, hf_ptp_v2_oe_tlv_subtype_smpte_timeofnextjam,
tvb, Offset, 6, ENC_BIG_ENDIAN);
Offset += 6;
proto_tree_add_item(ptp_smptedata_tree, hf_ptp_v2_oe_tlv_subtype_smpte_timeofpreviousjam,
tvb, Offset, 6, ENC_BIG_ENDIAN);
Offset += 6;
proto_tree_add_item(ptp_smptedata_tree, hf_ptp_v2_oe_tlv_subtype_smpte_previousjamlocaloffset,
tvb, Offset, 4, ENC_BIG_ENDIAN);
Offset += 4;
daylightsavingflags_ti = proto_tree_add_item(ptp_smptedata_tree,
hf_ptp_v2_oe_tlv_subtype_smpte_daylightsaving, tvb, Offset, 1, ENC_NA);
ptp_daylightsaving_tree = proto_item_add_subtree(daylightsavingflags_ti, ett_ptp_oe_smpte_daylightsaving);
proto_tree_add_item(ptp_daylightsaving_tree,
hf_ptp_v2_oe_tlv_subtype_smpte_daylightsaving_current, tvb, Offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_daylightsaving_tree,
hf_ptp_v2_oe_tlv_subtype_smpte_daylightsaving_next, tvb, Offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(ptp_daylightsaving_tree,
hf_ptp_v2_oe_tlv_subtype_smpte_daylightsaving_previous, tvb, Offset, 1, ENC_BIG_ENDIAN);
Offset += 1;
leapsecondjumpflags_ti = proto_tree_add_item(ptp_smptedata_tree,
hf_ptp_v2_oe_tlv_subtype_smpte_leapsecondjump, tvb, Offset, 1, ENC_NA);
ptp_leapsecondjump_tree = proto_item_add_subtree(leapsecondjumpflags_ti, ett_ptp_oe_smpte_leapsecondjump);
proto_tree_add_item(ptp_leapsecondjump_tree,
hf_ptp_v2_oe_tlv_subtype_smpte_leapsecondjump_change, tvb, Offset, 1, ENC_BIG_ENDIAN);
break;
}
}
break;
}
}
}
default:
{
break;
}
} /* switch TLV Type */
} /* case Management Message */
} /* switch message ID */
} /* tree */
}
/* Register the protocol with Wireshark */
void
proto_register_ptp(void)
{
static hf_register_info hf[] = {
/* PTPv1 fields **********************************************************/
/* Common fields for all frames */
{ &hf_ptp_versionptp,
{ "versionPTP", "ptp.versionptp",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_versionnetwork,
{ "versionNetwork", "ptp.versionnetwork",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_subdomain,
{ "subdomain", "ptp.subdomain",
FT_STRING, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_messagetype,
{ "messageType", "ptp.messagetype",
FT_UINT8, BASE_DEC, VALS(ptp_messagetype_vals), 0x00,
NULL, HFILL }
},
{ &hf_ptp_sourcecommunicationtechnology,
{ "sourceCommunicationTechnology", "ptp.sourcecommunicationtechnology",
FT_UINT8, BASE_DEC | BASE_EXT_STRING, &ptp_communicationid_vals_ext, 0x00,
NULL, HFILL }
},
{ &hf_ptp_sourceuuid,
{ "sourceUuid", "ptp.sourceuuid",
FT_ETHER, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_sourceportid,
{ "sourcePortId", "ptp.sourceportid",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_sequenceid,
{ "sequenceId", "ptp.sequenceid",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_control,
{ "control", "ptp.control",
FT_UINT8, BASE_DEC, VALS(ptp_control_vals), 0x00,
NULL, HFILL }
},
/* THE FLAGS-FIELD */
{ &hf_ptp_flags,
{ "flags", "ptp.flags",
FT_UINT16, BASE_HEX, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_flags_li61,
{ "PTP_LI61", "ptp.flags.li61",
FT_BOOLEAN, 16, NULL, PTP_FLAGS_LI61_BITMASK,
NULL, HFILL }
},
{ &hf_ptp_flags_li59,
{ "PTP_LI59", "ptp.flags.li59",
FT_BOOLEAN, 16, NULL, PTP_FLAGS_LI59_BITMASK,
NULL, HFILL }
},
{ &hf_ptp_flags_boundary_clock,
{ "PTP_BOUNDARY_CLOCK", "ptp.flags.boundary_clock",
FT_BOOLEAN, 16, NULL, PTP_FLAGS_BOUNDARY_CLOCK_BITMASK,
NULL, HFILL }
},
{ &hf_ptp_flags_assist,
{ "PTP_ASSIST", "ptp.flags.assist",
FT_BOOLEAN, 16, NULL, PTP_FLAGS_ASSIST_BITMASK,
NULL, HFILL }
},
{ &hf_ptp_flags_ext_sync,
{ "PTP_EXT_SYNC", "ptp.flags.ext_sync",
FT_BOOLEAN, 16, NULL, PTP_FLAGS_EXT_SYNC_BITMASK,
NULL, HFILL }
},
{ &hf_ptp_flags_parent,
{ "PTP_PARENT_STATS", "ptp.flags.parent_stats",
FT_BOOLEAN, 16, NULL, PTP_FLAGS_PARENT_STATS_BITMASK,
NULL, HFILL }
},
{ &hf_ptp_flags_sync_burst,
{ "PTP_SYNC_BURST", "ptp.flags.sync_burst",
FT_BOOLEAN, 16, NULL, PTP_FLAGS_SYNC_BURST_BITMASK,
NULL, HFILL }
},
/* END OF THE FLAG-FIELD */
/* offsets for ptp_sync and delay_req (=sdr) messages */
{ &hf_ptp_sdr_origintimestamp,
{ "originTimestamp", "ptp.sdr.origintimestamp",
FT_RELATIVE_TIME, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_sdr_origintimestamp_seconds,
{ "originTimestamp (seconds)", "ptp.sdr.origintimestamp_seconds",
FT_UINT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_sdr_origintimestamp_nanoseconds,
{ "originTimestamp (nanoseconds)", "ptp.sdr.origintimestamp_nanoseconds",
FT_INT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_sdr_epochnumber,
{ "epochNumber", "ptp.sdr.epochnumber",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_sdr_currentutcoffset,
{ "currentUTCOffset", "ptp.sdr.currentutcoffset",
FT_INT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_sdr_grandmastercommunicationtechnology,
{ "grandmasterCommunicationTechnology", "ptp.sdr.grandmastercommunicationtechnology",
FT_UINT8, BASE_DEC | BASE_EXT_STRING, &ptp_communicationid_vals_ext, 0x00,
NULL, HFILL }
},
{ &hf_ptp_sdr_grandmasterclockuuid,
{ "grandMasterClockUuid", "ptp.sdr.grandmasterclockuuid",
FT_ETHER, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_sdr_grandmasterportid,
{ "grandmasterPortId", "ptp.sdr.grandmasterportid",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_sdr_grandmastersequenceid,
{ "grandmasterSequenceId", "ptp.sdr.grandmastersequenceid",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_sdr_grandmasterclockstratum,
{ "grandmasterClockStratum", "ptp.sdr.grandmasterclockstratum",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_sdr_grandmasterclockidentifier,
{ "grandmasterClockIdentifier", "ptp.sdr.grandmasterclockidentifier",
FT_STRING, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_sdr_grandmasterclockvariance,
{ "grandmasterClockVariance", "ptp.sdr.grandmasterclockvariance",
FT_INT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_sdr_grandmasterpreferred,
{ "grandmasterPreferred", "ptp.sdr.grandmasterpreferred",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_sdr_grandmasterisboundaryclock,
{ "grandmasterIsBoundaryClock", "ptp.sdr.grandmasterisboundaryclock",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_sdr_syncinterval,
{ "syncInterval", "ptp.sdr.syncinterval",
FT_INT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_sdr_localclockvariance,
{ "localClockVariance", "ptp.sdr.localclockvariance",
FT_INT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_sdr_localstepsremoved,
{ "localStepsRemoved", "ptp.sdr.localstepsremoved",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_sdr_localclockstratum,
{ "localClockStratum", "ptp.sdr.localclockstratum",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_sdr_localclockidentifier,
{ "localClockIdentifier", "ptp.sdr.localclockidentifier",
FT_STRING, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_sdr_parentcommunicationtechnology,
{ "parentCommunicationTechnology", "ptp.sdr.parentcommunicationtechnology",
FT_UINT8, BASE_DEC | BASE_EXT_STRING, &ptp_communicationid_vals_ext, 0x00,
NULL, HFILL }
},
{ &hf_ptp_sdr_parentuuid,
{ "parentUuid", "ptp.sdr.parentuuid",
FT_ETHER, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_sdr_parentportfield,
{ "parentPortField", "ptp.sdr.parentportfield",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_sdr_estimatedmastervariance,
{ "estimatedMasterVariance", "ptp.sdr.estimatedmastervariance",
FT_INT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_sdr_estimatedmasterdrift,
{ "estimatedMasterDrift", "ptp.sdr.estimatedmasterdrift",
FT_INT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_sdr_utcreasonable,
{ "utcReasonable", "ptp.sdr.utcreasonable",
FT_BOOLEAN, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
/* offsets for follow_up (=fu) messages */
{ &hf_ptp_fu_associatedsequenceid,
{ "associatedSequenceId", "ptp.fu.associatedsequenceid",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_fu_preciseorigintimestamp,
{ "preciseOriginTimestamp", "ptp.fu.preciseorigintimestamp",
FT_RELATIVE_TIME, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_fu_preciseorigintimestamp_seconds,
{ "preciseOriginTimestamp (seconds)", "ptp.fu.preciseorigintimestamp_seconds",
FT_UINT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_fu_preciseorigintimestamp_nanoseconds,
{ "preciseOriginTimestamp (nanoseconds)", "ptp.fu.preciseorigintimestamp_nanoseconds",
FT_INT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
/* offsets for delay_resp (=dr) messages */
{ &hf_ptp_dr_delayreceipttimestamp,
{ "delayReceiptTimestamp", "ptp.dr.delayreceipttimestamp",
FT_RELATIVE_TIME, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_dr_delayreceipttimestamp_seconds,
{ "delayReceiptTimestamp (Seconds)", "ptp.dr.delayreceipttimestamp_seconds",
FT_UINT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_dr_delayreceipttimestamp_nanoseconds,
{ "delayReceiptTimestamp (nanoseconds)", "ptp.dr.delayreceipttimestamp_nanoseconds",
FT_INT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_dr_requestingsourcecommunicationtechnology,
{ "requestingSourceCommunicationTechnology", "ptp.dr.requestingsourcecommunicationtechnology",
FT_UINT8, BASE_DEC | BASE_EXT_STRING, &ptp_communicationid_vals_ext, 0x00,
NULL, HFILL }
},
{ &hf_ptp_dr_requestingsourceuuid,
{ "requestingSourceUuid", "ptp.dr.requestingsourceuuid",
FT_ETHER, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_dr_requestingsourceportid,
{ "requestingSourcePortId", "ptp.dr.requestingsourceportid",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_dr_requestingsourcesequenceid,
{ "requestingSourceSequenceId", "ptp.dr.requestingsourcesequenceid",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
/* offsets for management (=mm) messages */
{ &hf_ptp_mm_targetcommunicationtechnology,
{ "targetCommunicationTechnology", "ptp.mm.targetcommunicationtechnology",
FT_UINT8, BASE_DEC | BASE_EXT_STRING, &ptp_communicationid_vals_ext, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_targetuuid,
{ "targetUuid", "ptp.mm.targetuuid",
FT_ETHER, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_targetportid,
{ "targetPortId", "ptp.mm.targetportid",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_startingboundaryhops,
{ "startingBoundaryHops", "ptp.mm.startingboundaryhops",
FT_INT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_boundaryhops,
{ "boundaryHops", "ptp.mm.boundaryhops",
FT_INT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_managementmessagekey,
{ "managementMessageKey", "ptp.mm.managementmessagekey",
FT_UINT8, BASE_DEC | BASE_EXT_STRING, &ptp_managementMessageKey_vals_ext, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_parameterlength,
{ "parameterLength", "ptp.mm.parameterlength",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
/* parameterlength > 0 */
#if 0
{ &hf_ptp_mm_messageparameters,
{ "messageParameters", "ptp.mm.messageparameters",
FT_BYTES, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
#endif
/* ptp_mm_clock_identity (parameterlength = 64) */
{ &hf_ptp_mm_clock_identity_clockcommunicationtechnology,
{ "clockCommunicationTechnology", "ptp.mm.clock.identity.clockcommunicationtechnology",
FT_UINT8, BASE_DEC | BASE_EXT_STRING, &ptp_communicationid_vals_ext, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_clock_identity_clockuuidfield,
{ "clockUuidField", "ptp.mm.clock.identity.clockuuidfield",
FT_ETHER, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_clock_identity_clockportfield,
{ "clockPortField", "ptp.mm.clock.identity.clockportfield",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_clock_identity_manufactureridentity,
{ "manufacturerIdentity", "ptp.mm.clock.identity.manufactureridentity",
FT_BYTES, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
/* ptp_mm_initialize_clock (parameterlength = 4) */
{ &hf_ptp_mm_initialize_clock_initialisationkey,
{ "initialisationKey", "ptp.mm.initialize.clock.initialisationkey",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
/* ptp_mm_set_subdomain (parameterlength = 16) */
{ &hf_ptp_mm_set_subdomain_subdomainname,
{ "subdomainName", "ptp.mm.set.subdomain.subdomainname",
FT_STRING, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
/* ptp_mm_default_data_set (parameterlength = 76) */
{ &hf_ptp_mm_default_data_set_clockcommunicationtechnology,
{ "clockCommunicationTechnology", "ptp.mm.default.data.set.clockcommunicationtechnology",
FT_UINT8, BASE_DEC | BASE_EXT_STRING, &ptp_communicationid_vals_ext, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_default_data_set_clockuuidfield,
{ "clockUuidField", "ptp.mm.default.data.set.clockuuidfield",
FT_ETHER, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_default_data_set_clockportfield,
{ "clockPortField", "ptp.mm.default.data.set.clockportfield",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_default_data_set_clockstratum,
{ "clockStratum", "ptp.mm.default.data.set.clockstratum",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_default_data_set_clockidentifier,
{ "clockIdentifier", "ptp.mm.default.data.set.clockidentifier",
FT_BYTES, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_default_data_set_clockvariance,
{ "clockVariance", "ptp.mm.default.data.set.clockvariance",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_default_data_set_clockfollowupcapable,
{ "clockFollowupCapable", "ptp.mm.default.data.set.clockfollowupcapable",
FT_BOOLEAN, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_ptp_mm_default_data_set_preferred,
{ "preferred", "ptp.mm.default.data.set.preferred",
FT_BOOLEAN, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_ptp_mm_default_data_set_initializable,
{ "initializable", "ptp.mm.default.data.set.initializable",
FT_BOOLEAN, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_ptp_mm_default_data_set_externaltiming,
{ "externalTiming", "ptp.mm.default.data.set.externaltiming",
FT_BOOLEAN, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_ptp_mm_default_data_set_isboundaryclock,
{ "isBoundaryClock", "ptp.mm.default.data.set.isboundaryclock",
FT_BOOLEAN, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_ptp_mm_default_data_set_syncinterval,
{ "syncInterval", "ptp.mm.default.data.set.syncinterval",
FT_INT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_default_data_set_subdomainname,
{ "subDomainName", "ptp.mm.default.data.set.subdomainname",
FT_STRING, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_default_data_set_numberports,
{ "numberPorts", "ptp.mm.default.data.set.numberports",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_default_data_set_numberforeignrecords,
{ "numberForeignRecords", "ptp.mm.default.data.set.numberforeignrecords",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
/* ptp_mm_update_default_data_set (parameterlength = 36) */
{ &hf_ptp_mm_update_default_data_set_clockstratum,
{ "clockStratum", "ptp.mm.update.default.data.set.clockstratum",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_update_default_data_set_clockidentifier,
{ "clockIdentifier", "ptp.mm.update.default.data.set.clockidentifier",
FT_BYTES, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_update_default_data_set_clockvariance,
{ "clockVariance", "ptp.mm.update.default.data.set.clockvariance",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_update_default_data_set_preferred,
{ "preferred", "ptp.mm.update.default.data.set.preferred",
FT_BOOLEAN, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_ptp_mm_update_default_data_set_syncinterval,
{ "syncInterval", "ptp.mm.update.default.data.set.syncinterval",
FT_INT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_update_default_data_set_subdomainname,
{ "subdomainName", "ptp.mm.update.default.data.set.subdomainname",
FT_STRING, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
/* ptp_mm_current_data_set (parameterlength = 20) */
{ &hf_ptp_mm_current_data_set_stepsremoved,
{ "stepsRemoved", "ptp.mm.current.data.set.stepsremoved",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_current_data_set_offsetfrommaster,
{ "offsetFromMaster", "ptp.mm.current.data.set.offsetfrommaster",
FT_RELATIVE_TIME, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_current_data_set_offsetfrommasterseconds,
{ "offsetFromMasterSeconds", "ptp.mm.current.data.set.offsetfrommasterseconds",
FT_UINT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_current_data_set_offsetfrommasternanoseconds,
{ "offsetFromMasterNanoseconds", "ptp.mm.current.data.set.offsetfrommasternanoseconds",
FT_INT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_current_data_set_onewaydelay,
{ "oneWayDelay", "ptp.mm.current.data.set.onewaydelay",
FT_RELATIVE_TIME, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_current_data_set_onewaydelayseconds,
{ "oneWayDelaySeconds", "ptp.mm.current.data.set.onewaydelayseconds",
FT_UINT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_current_data_set_onewaydelaynanoseconds,
{ "oneWayDelayNanoseconds", "ptp.mm.current.data.set.onewaydelaynanoseconds",
FT_INT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
/* ptp_mm_parent_data_set (parameterlength = 90) */
{ &hf_ptp_mm_parent_data_set_parentcommunicationtechnology,
{ "parentCommunicationTechnology", "ptp.mm.parent.data.set.parentcommunicationtechnology",
FT_UINT8, BASE_DEC | BASE_EXT_STRING, &ptp_communicationid_vals_ext, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_parent_data_set_parentuuid,
{ "parentUuid", "ptp.mm.parent.data.set.parentuuid",
FT_ETHER, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_parent_data_set_parentportid,
{ "parentPortId", "ptp.mm.parent.data.set.parentportid",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_parent_data_set_parentlastsyncsequencenumber,
{ "parentLastSyncSequenceNumber", "ptp.mm.parent.data.set.parentlastsyncsequencenumber",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_parent_data_set_parentfollowupcapable,
{ "parentFollowupCapable", "ptp.mm.parent.data.set.parentfollowupcapable",
FT_BOOLEAN, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_ptp_mm_parent_data_set_parentexternaltiming,
{ "parentExternalTiming", "ptp.mm.parent.data.set.parentexternaltiming",
FT_BOOLEAN, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_ptp_mm_parent_data_set_parentvariance,
{ "parentVariance", "ptp.mm.parent.data.set.parentvariance",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_parent_data_set_parentstats,
{ "parentStats", "ptp.mm.parent.data.set.parentstats",
FT_BOOLEAN, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_ptp_mm_parent_data_set_observedvariance,
{ "observedVariance", "ptp.mm.parent.data.set.observedvariance",
FT_INT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_parent_data_set_observeddrift,
{ "observedDrift", "ptp.mm.parent.data.set.observeddrift",
FT_INT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_parent_data_set_utcreasonable,
{ "utcReasonable", "ptp.mm.parent.data.set.utcreasonable",
FT_BOOLEAN, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_ptp_mm_parent_data_set_grandmastercommunicationtechnology,
{ "grandmasterCommunicationTechnology", "ptp.mm.parent.data.set.grandmastercommunicationtechnology",
FT_UINT8, BASE_DEC | BASE_EXT_STRING, &ptp_communicationid_vals_ext, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_parent_data_set_grandmasteruuidfield,
{ "grandmasterUuidField", "ptp.mm.parent.data.set.grandmasteruuidfield",
FT_ETHER, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_parent_data_set_grandmasterportidfield,
{ "grandmasterPortIdField", "ptp.mm.parent.data.set.grandmasterportidfield",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_parent_data_set_grandmasterstratum,
{ "grandmasterStratum", "ptp.mm.parent.data.set.grandmasterstratum",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_parent_data_set_grandmasteridentifier,
{ "grandmasterIdentifier", "ptp.mm.parent.data.set.grandmasteridentifier",
FT_BYTES, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_parent_data_set_grandmastervariance,
{ "grandmasterVariance", "ptp.mm.parent.data.set.grandmastervariance",
FT_INT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_parent_data_set_grandmasterpreferred,
{ "grandmasterPreferred", "ptp.mm.parent.data.set.grandmasterpreferred",
FT_BOOLEAN, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_ptp_mm_parent_data_set_grandmasterisboundaryclock,
{ "grandmasterIsBoundaryClock", "ptp.mm.parent.data.set.grandmasterisboundaryclock",
FT_BOOLEAN, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_ptp_mm_parent_data_set_grandmastersequencenumber,
{ "grandmasterSequenceNumber", "ptp.mm.parent.data.set.grandmastersequencenumber",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
/* ptp_mm_port_data_set (parameterlength = 52) */
{ &hf_ptp_mm_port_data_set_returnedportnumber,
{ "returnedPortNumber", "ptp.mm.port.data.set.returnedportnumber",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_port_data_set_portstate,
{ "portState", "ptp.mm.port.data.set.portstate",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_port_data_set_lastsynceventsequencenumber,
{ "lastSyncEventSequenceNumber", "ptp.mm.port.data.set.lastsynceventsequencenumber",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_port_data_set_lastgeneraleventsequencenumber,
{ "lastGeneralEventSequenceNumber", "ptp.mm.port.data.set.lastgeneraleventsequencenumber",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_port_data_set_portcommunicationtechnology,
{ "portCommunicationTechnology", "ptp.mm.port.data.set.portcommunicationtechnology",
FT_UINT8, BASE_DEC | BASE_EXT_STRING, &ptp_communicationid_vals_ext, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_port_data_set_portuuidfield,
{ "portUuidField", "ptp.mm.port.data.set.portuuidfield",
FT_ETHER, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_port_data_set_portidfield,
{ "portIdField", "ptp.mm.port.data.set.portidfield",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_port_data_set_burstenabled,
{ "burstEnabled", "ptp.mm.port.data.set.burstenabled",
FT_BOOLEAN, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_ptp_mm_port_data_set_subdomainaddressoctets,
{ "subdomainAddressOctets", "ptp.mm.port.data.set.subdomainaddressoctets",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_port_data_set_eventportaddressoctets,
{ "eventPortAddressOctets", "ptp.mm.port.data.set.eventportaddressoctets",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_port_data_set_generalportaddressoctets,
{ "generalPortAddressOctets", "ptp.mm.port.data.set.generalportaddressoctets",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_port_data_set_subdomainaddress,
{ "subdomainAddress", "ptp.mm.port.data.set.subdomainaddress",
FT_BYTES, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_port_data_set_eventportaddress,
{ "eventPortAddress", "ptp.mm.port.data.set.eventportaddress",
FT_BYTES, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_port_data_set_generalportaddress,
{ "generalPortAddress", "ptp.mm.port.data.set.generalportaddress",
FT_BYTES, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
/* ptp_mm_global_time_data_set (parameterlength = 24) */
{ &hf_ptp_mm_global_time_data_set_localtime,
{ "localTime", "ptp.mm.global.time.data.set.localtime",
FT_RELATIVE_TIME, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_global_time_data_set_localtimeseconds,
{ "localTimeSeconds", "ptp.mm.global.time.data.set.localtimeseconds",
FT_UINT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_global_time_data_set_localtimenanoseconds,
{ "localTimeNanoseconds", "ptp.mm.global.time.data.set.localtimenanoseconds",
FT_INT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_global_time_data_set_currentutcoffset,
{ "currentUtcOffset", "ptp.mm.global.time.data.set.currentutcoffset",
FT_INT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_global_time_data_set_leap59,
{ "leap59", "ptp.mm.global.time.data.set.leap59",
FT_BOOLEAN, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_ptp_mm_global_time_data_set_leap61,
{ "leap61", "ptp.mm.global.time.data.set.leap61",
FT_BOOLEAN, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_ptp_mm_global_time_data_set_epochnumber,
{ "epochNumber", "ptp.mm.global.time.data.set.epochnumber",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
/* ptp_mm_update_global_time_properties (parameterlength = 16) */
{ &hf_ptp_mm_update_global_time_properties_currentutcoffset,
{ "currentUtcOffset", "ptp.mm.update.global.time.properties.currentutcoffset",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_update_global_time_properties_leap59,
{ "leap59", "ptp.mm.update.global.time.properties.leap59",
FT_BOOLEAN, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_ptp_mm_update_global_time_properties_leap61,
{ "leap61", "ptp.mm.update.global.time.properties.leap61",
FT_BOOLEAN, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
#if 0
{ &hf_ptp_mm_update_global_time_properties_epochnumber,
{ "epochNumber", "ptp.mm.update.global.time.properties.epochnumber",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
#endif
/* ptp_mm_get_foreign_data_set (parameterlength = 4) */
{ &hf_ptp_mm_get_foreign_data_set_recordkey,
{ "recordKey", "ptp.mm.get.foreign.data.set.recordkey",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
/* ptp_mm_foreign_data_set (parameterlength = 28) */
{ &hf_ptp_mm_foreign_data_set_returnedportnumber,
{ "returnedPortNumber", "ptp.mm.foreign.data.set.returnedportnumber",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_foreign_data_set_returnedrecordnumber,
{ "returnedRecordNumber", "ptp.mm.foreign.data.set.returnedrecordnumber",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_foreign_data_set_foreignmastercommunicationtechnology,
{ "foreignMasterCommunicationTechnology",
"ptp.mm.foreign.data.set.foreignmastercommunicationtechnology",
FT_UINT8, BASE_DEC | BASE_EXT_STRING, &ptp_communicationid_vals_ext, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_foreign_data_set_foreignmasteruuidfield,
{ "foreignMasterUuidField", "ptp.mm.foreign.data.set.foreignmasteruuidfield",
FT_ETHER, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_foreign_data_set_foreignmasterportidfield,
{ "foreignMasterPortIdField", "ptp.mm.foreign.data.set.foreignmasterportidfield",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_foreign_data_set_foreignmastersyncs,
{ "foreignMasterSyncs", "ptp.mm.foreign.data.set.foreignmastersyncs",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
/* ptp_mm_set_sync_interval (parameterlength = 4) */
{ &hf_ptp_mm_set_sync_interval_syncinterval,
{ "syncInterval", "ptp.mm.set.sync.interval.syncinterval",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
/* ptp_mm_set_time (parameterlength = 8) */
{ &hf_ptp_mm_set_time_localtime,
{ "localtime", "ptp.mm.set.time.localtime",
FT_RELATIVE_TIME, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_set_time_localtimeseconds,
{ "localtimeSeconds", "ptp.mm.set.time.localtimeseconds",
FT_UINT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_mm_set_time_localtimenanoseconds,
{ "localTimeNanoseconds", "ptp.mm.set.time.localtimenanoseconds",
FT_INT32, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
/* PTPv2 fields **********************************************************/
/* Common fields for all frames */
{ &hf_ptp_v2_transportspecific,
{ "transportSpecific", "ptp.v2.transportspecific",
FT_UINT8, BASE_HEX, NULL, 0xF0,
NULL, HFILL }
},
{ &hf_ptp_v2_transportspecific_v1_compatibility,
{ "V1 Compatibility", "ptp.v2.transportspecific.v1compatibility",
FT_BOOLEAN, 8, NULL, PTP_V2_TRANSPORTSPECIFIC_V1COMPATIBILITY_BITMASK,
NULL, HFILL }
},
{ &hf_ptp_v2_transportspecific_802as_conform,
{ "802.1as conform", "ptp.v2.transportspecific.802.1asconform",
FT_BOOLEAN, 8, NULL, PTP_V2_TRANSPORTSPECIFIC_V1COMPATIBILITY_BITMASK,
NULL, HFILL }
},
{ &hf_ptp_v2_messageid,
{ "messageId", "ptp.v2.messageid",
FT_UINT8, BASE_HEX | BASE_EXT_STRING, &ptp_v2_messageid_vals_ext, 0x0F,
NULL, HFILL }
},
{ &hf_ptp_v2_versionptp,
{ "versionPTP", "ptp.v2.versionptp",
FT_UINT8, BASE_DEC, NULL, 0x0F,
NULL, HFILL }
},
{ &hf_ptp_v2_messagelength,
{ "messageLength", "ptp.v2.messagelength",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_domainnumber,
{ "subdomainNumber", "ptp.v2.subdomainnumber",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_flags,
{ "flags", "ptp.v2.flags",
FT_UINT16, BASE_HEX, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_flags_alternatemaster,
{ "PTP_ALTERNATE_MASTER", "ptp.v2.flags.alternatemaster",
FT_BOOLEAN, 16, NULL, PTP_V2_FLAGS_ALTERNATE_BITMASK,
NULL, HFILL }
},
{ &hf_ptp_v2_flags_twostep,
{ "PTP_TWO_STEP", "ptp.v2.flags.twostep",
FT_BOOLEAN, 16, NULL, PTP_V2_FLAGS_TWO_STEP_BITMASK,
NULL, HFILL }
},
{ &hf_ptp_v2_flags_unicast,
{ "PTP_UNICAST", "ptp.v2.flags.unicast",
FT_BOOLEAN, 16, NULL, PTP_V2_FLAGS_UNICAST_BITMASK,
NULL, HFILL }
},
{ &hf_ptp_v2_flags_specific1,
{ "PTP profile Specific 1", "ptp.v2.flags.specific1",
FT_BOOLEAN, 16, NULL, PTP_V2_FLAGS_SPECIFIC1_BITMASK,
NULL, HFILL }
},
{ &hf_ptp_v2_flags_specific2,
{ "PTP profile Specific 2", "ptp.v2.flags.specific2",
FT_BOOLEAN, 16, NULL, PTP_V2_FLAGS_SPECIFIC2_BITMASK,
NULL, HFILL }
},
{ &hf_ptp_v2_flags_security,
{ "PTP_SECURITY", "ptp.v2.flags.security",
FT_BOOLEAN, 16, NULL, PTP_V2_FLAGS_SECURITY_BITMASK,
NULL, HFILL }
},
{ &hf_ptp_v2_flags_li61,
{ "PTP_LI_61", "ptp.v2.flags.li61",
FT_BOOLEAN, 16, NULL, PTP_V2_FLAGS_LI61_BITMASK,
NULL, HFILL }
},
{ &hf_ptp_v2_flags_li59,
{ "PTP_LI_59", "ptp.v2.flags.li59",
FT_BOOLEAN, 16, NULL, PTP_V2_FLAGS_LI59_BITMASK,
NULL, HFILL }
},
{ &hf_ptp_v2_flags_utcoffsetvalid,
{ "PTP_UTC_REASONABLE", "ptp.v2.flags.utcreasonable",
FT_BOOLEAN, 16, NULL, PTP_V2_FLAGS_UTC_OFFSET_VALID_BITMASK,
NULL, HFILL }
},
{ &hf_ptp_v2_flags_ptptimescale,
{ "PTP_TIMESCALE", "ptp.v2.flags.timescale",
FT_BOOLEAN, 16, NULL, PTP_V2_FLAGS_PTP_TIMESCALE_BITMASK,
NULL, HFILL }
},
{ &hf_ptp_v2_flags_timetraceable,
{ "TIME_TRACEABLE", "ptp.v2.flags.timetraceable",
FT_BOOLEAN, 16, NULL, PTP_V2_FLAGS_TIME_TRACEABLE_BITMASK,
NULL, HFILL }
},
{ &hf_ptp_v2_flags_frequencytraceable,
{ "FREQUENCY_TRACEABLE", "ptp.v2.flags.frequencytraceable",
FT_BOOLEAN, 16, NULL, PTP_V2_FLAGS_FREQUENCY_TRACEABLE_BITMASK,
NULL, HFILL }
},
{ &hf_ptp_v2_correction,
{ "correction", "ptp.v2.correction.ns",
FT_UINT64, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_correctionsubns,
{ "correctionSubNs", "ptp.v2.correction.subns",
FT_DOUBLE, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_clockidentity,
{ "ClockIdentity", "ptp.v2.clockidentity",
FT_UINT64, BASE_HEX, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_sourceportid,
{ "SourcePortID", "ptp.v2.sourceportid",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_sequenceid,
{ "sequenceId", "ptp.v2.sequenceid",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_control,
{ "control", "ptp.v2.control",
FT_UINT8, BASE_DEC, VALS(ptp_control_vals), 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_logmessageperiod,
{ "logMessagePeriod", "ptp.v2.logmessageperiod",
FT_INT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
/* Fields for PTP_Announce (=an) messages */
#if 0
{ &hf_ptp_v2_an_origintimestamp,
{ "originTimestamp", "ptp.v2.an.origintimestamp",
FT_RELATIVE_TIME, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
#endif
{ &hf_ptp_v2_an_origintimestamp_seconds,
{ "originTimestamp (seconds)", "ptp.v2.an.origintimestamp.seconds",
FT_UINT64, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_an_origintimestamp_nanoseconds,
{ "originTimestamp (nanoseconds)", "ptp.v2.an.origintimestamp.nanoseconds",
FT_INT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_an_origincurrentutcoffset,
{ "originCurrentUTCOffset", "ptp.v2.an.origincurrentutcoffset",
FT_INT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_an_timesource,
{ "TimeSource", "ptp.v2.timesource",
FT_UINT8, BASE_HEX | BASE_EXT_STRING, &ptp_v2_timeSource_vals_ext, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_an_localstepsremoved,
{ "localStepsRemoved", "ptp.v2.an.localstepsremoved",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_an_grandmasterclockidentity,
{ "grandmasterClockIdentity", "ptp.v2.an.grandmasterclockidentity",
FT_UINT64, BASE_HEX, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_an_grandmasterclockclass,
{ "grandmasterClockClass", "ptp.v2.an.grandmasterclockclass",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_an_grandmasterclockaccuracy,
{ "grandmasterClockAccuracy", "ptp.v2.an.grandmasterclockaccuracy",
FT_UINT8, BASE_HEX | BASE_EXT_STRING, &ptp_v2_clockAccuracy_vals_ext, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_an_grandmasterclockvariance,
{ "grandmasterClockVariance", "ptp.v2.an.grandmasterclockvariance",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_an_priority1,
{ "priority1", "ptp.v2.an.priority1",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_an_priority2,
{ "priority2", "ptp.v2.an.priority2",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
/* Fields for PTP_Announce TLVs */
{ &hf_ptp_v2_an_tlv_tlvtype,
{ "tlvType", "ptp.v2.an.tlvType",
FT_UINT16, BASE_DEC | BASE_EXT_STRING, &ptp_v2_TLV_type_vals_ext, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_an_tlv_lengthfield,
{ "lengthField", "ptp.v2.an.lengthField",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
/* Fields for ORGANIZATION_EXTENSION TLV */
{ &hf_ptp_v2_oe_tlv_organizationid,
{ "organizationId", "ptp.v2.an.oe.organizationId",
FT_UINT24, BASE_HEX, VALS(ptp_v2_organizationExtensionOrgId_vals), 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_oe_tlv_organizationsubtype,
{ "organizationSubType", "ptp.v2.an.oe.organizationSubType",
FT_UINT24, BASE_HEX, VALS(ptp_v2_org_iee_c37_238_subtype_vals), 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_oe_tlv_datafield,
{ "dataField", "ptp.v2.an.oe.dataField",
FT_BYTES, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
/* Fields for IEEE_C37_238 TLV (OE TLV subtype) */
{ &hf_ptp_v2_oe_tlv_subtype_c37238tlv_grandmasterid,
{ "grandmasterID", "ptp.v2.an.oe.grandmasterID",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_oe_tlv_subtype_c37238tlv_grandmastertimeinaccuracy,
{ "grandmasterTimeInaccuracy (nanoseconds)", "ptp.v2.an.oe.grandmasterTimeInaccuracy",
FT_UINT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_oe_tlv_subtype_c37238tlv_networktimeinaccuracy,
{ "networkTimeInaccuracy (nanoseconds)", "ptp.v2.an.oe.networkTimeInaccuracy",
FT_UINT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_oe_tlv_subtype_c37238tlv_reserved,
{ "reserved", "ptp.v2.an.oe.reserved",
FT_UINT16, BASE_HEX, NULL, 0x00,
NULL, HFILL }
},
/* Fields for ALTERNATE_TIME_OFFSET_INDICATOR TLV */
{ &hf_ptp_v2_atoi_tlv_keyfield,
{ "keyField", "ptp.v2.an.atoi.keyField",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_atoi_tlv_currentoffset,
{ "currentOffset", "ptp.v2.an.atoi.currentOffset",
FT_INT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_atoi_tlv_jumpseconds,
{ "jumpSeconds", "ptp.v2.an.atoi.jumpSeconds",
FT_INT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_atoi_tlv_timeofnextjump,
{ "timeOfNextJump", "ptp.v2.an.atoi.timeOfNextJump",
FT_BYTES, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_atoi_tlv_displayname,
{ "displayName", "ptp.v2.an.atoi.dislpayName",
FT_STRING, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_atoi_tlv_displayname_length,
{ "length", "ptp.v2.an.atoi.dislpayName.length",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
/* Field for Path Trace TLV */
{ &hf_ptp_v2_an_tlv_pathsequence,
{ "PathSequence", "ptp.v2.an.pathsequence",
FT_UINT64, BASE_HEX, NULL, 0x00,
NULL, HFILL }
},
/* Fields for undissected TLV */
{ &hf_ptp_v2_an_tlv_data,
{ "data", "ptp.v2.an.tlv.data",
FT_BYTES, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
/* Fields for PTP_Sync AND PTP_DelayRequest (=sdr) messages */
#if 0
{ &hf_ptp_v2_sdr_origintimestamp,
{ "originTimestamp", "ptp.v2.sdr.origintimestamp",
FT_RELATIVE_TIME, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
#endif
{ &hf_ptp_v2_sdr_origintimestamp_seconds,
{ "originTimestamp (seconds)", "ptp.v2.sdr.origintimestamp.seconds",
FT_UINT64, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_sdr_origintimestamp_nanoseconds,
{ "originTimestamp (nanoseconds)", "ptp.v2.sdr.origintimestamp.nanoseconds",
FT_INT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
/* Fields for PTP_Follow_Up (=fu) messages */
#if 0
{ &hf_ptp_v2_fu_preciseorigintimestamp,
{ "preciseOriginTimestamp", "ptp.v2.fu.preciseorigintimestamp",
FT_RELATIVE_TIME, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
#endif
{ &hf_ptp_v2_fu_preciseorigintimestamp_seconds,
{ "preciseOriginTimestamp (seconds)", "ptp.v2.fu.preciseorigintimestamp.seconds",
FT_UINT64, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_fu_preciseorigintimestamp_nanoseconds,
{ "preciseOriginTimestamp (nanoseconds)", "ptp.v2.fu.preciseorigintimestamp.nanoseconds",
FT_INT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
/* Fields for PTP_Follow_up TLVs */
{ &hf_ptp_as_fu_tlv_tlvtype,
{ "tlvType", "ptp.as.fu.tlvType",
FT_UINT16, BASE_DEC | BASE_EXT_STRING, &ptp_v2_TLV_type_vals_ext, 0x00,
NULL, HFILL }
},
{ &hf_ptp_as_fu_tlv_lengthfield,
{ "lengthField", "ptp.as.fu.lengthField",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_as_fu_tlv_organization_id,
{ "organizationId", "ptp.as.fu.organizationId",
FT_UINT24, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_as_fu_tlv_organization_subtype,
{ "OrganizationSubType", "ptp.as.fu.organizationSubType",
FT_INT24, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_as_fu_tlv_cumulative_offset,
{ "cumulativeScaledRateOffset", "ptp.as.fu.cumulativeScaledRateOffset",
FT_UINT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_as_fu_tlv_gm_base_indicator,
{ "gmTimeBaseIndicator", "ptp.as.fu.gmTimeBaseIndicator",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_as_fu_tlv_last_gm_phase_change,
{ "lastGMPhaseChange", "ptp.as.fu.lastGmPhaseChange",
FT_BYTES, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_as_fu_tlv_scaled_last_gm_freq_change,
{ "scaledLastGmFreqChange", "ptp.as.fu.scaledLastGmFreqChange",
FT_INT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
/* Fields for PTP_DelayResponse (=dr) messages */
#if 0
{ &hf_ptp_v2_dr_receivetimestamp,
{ "receiveTimestamp", "ptp.v2.dr.receivetimestamp",
FT_RELATIVE_TIME, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
#endif
{ &hf_ptp_v2_dr_receivetimestamp_seconds,
{ "receiveTimestamp (seconds)", "ptp.v2.dr.receivetimestamp.seconds",
FT_UINT64, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_dr_receivetimestamp_nanoseconds,
{ "receiveTimestamp (nanoseconds)", "ptp.v2.dr.receivetimestamp.nanoseconds",
FT_INT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_dr_requestingportidentity,
{ "requestingSourcePortIdentity", "ptp.v2.dr.requestingsourceportidentity",
FT_UINT64, BASE_HEX, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_dr_requestingsourceportid,
{ "requestingSourcePortId", "ptp.v2.dr.requestingsourceportid",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
/* Fields for PTP_PDelayRequest (=pdrq) messages */
#if 0
{ &hf_ptp_v2_pdrq_origintimestamp,
{ "originTimestamp", "ptp.v2.pdrq.origintimestamp",
FT_RELATIVE_TIME, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
#endif
{ &hf_ptp_v2_pdrq_origintimestamp_seconds,
{ "originTimestamp (seconds)", "ptp.v2.pdrq.origintimestamp.seconds",
FT_UINT64, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_pdrq_origintimestamp_nanoseconds,
{ "originTimestamp (nanoseconds)", "ptp.v2.pdrq.origintimestamp.nanoseconds",
FT_INT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
/* Fields for PTP_PDelayResponse (=pdrs) messages */
#if 0
{ &hf_ptp_v2_pdrs_requestreceipttimestamp,
{ "requestreceiptTimestamp", "ptp.v2.pdrs.requestreceipttimestamp",
FT_RELATIVE_TIME, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
#endif
{ &hf_ptp_v2_pdrs_requestreceipttimestamp_seconds,
{ "requestreceiptTimestamp (seconds)", "ptp.v2.pdrs.requestreceipttimestamp.seconds",
FT_UINT64, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_pdrs_requestreceipttimestamp_nanoseconds,
{ "requestreceiptTimestamp (nanoseconds)", "ptp.v2.pdrs.requestreceipttimestamp.nanoseconds",
FT_INT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_pdrs_requestingportidentity,
{ "requestingSourcePortIdentity", "ptp.v2.pdrs.requestingportidentity",
FT_UINT64, BASE_HEX, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_pdrs_requestingsourceportid,
{ "requestingSourcePortId", "ptp.v2.pdrs.requestingsourceportid",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
/* Fields for PTP_PDelayResponseFollowUp (=pdfu) messages */
#if 0
{ &hf_ptp_v2_pdfu_responseorigintimestamp,
{ "responseOriginTimestamp", "ptp.v2.pdfu.responseorigintimestamp",
FT_RELATIVE_TIME, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
#endif
{ &hf_ptp_v2_pdfu_responseorigintimestamp_seconds,
{ "responseOriginTimestamp (seconds)", "ptp.v2.pdfu.responseorigintimestamp.seconds",
FT_UINT64, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_pdfu_responseorigintimestamp_nanoseconds,
{ "responseOriginTimestamp (nanoseconds)", "ptp.v2.pdfu.responseorigintimestamp.nanoseconds",
FT_INT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_pdfu_requestingportidentity,
{ "requestingSourcePortIdentity", "ptp.v2.pdfu.requestingportidentity",
FT_UINT64, BASE_HEX, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_pdfu_requestingsourceportid,
{ "requestingSourcePortId", "ptp.v2.pdfu.requestingsourceportid",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
/* Fields for PTP_Signalling (=sig) messages */
{ &hf_ptp_v2_sig_targetportidentity,
{ "targetPortIdentity", "ptp.v2.sig.targetportidentity",
FT_UINT64, BASE_HEX, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_sig_targetportid,
{ "targetPortId", "ptp.v2.sig.targetportid",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_sig_tlv_tlvType,
{ "tlvType", "ptp.v2.sig.tlv.tlvType",
FT_UINT16, BASE_DEC | BASE_EXT_STRING, &ptp_v2_TLV_type_vals_ext, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_sig_tlv_lengthField,
{ "lengthField", "ptp.v2.sig.tlv.lengthField",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_sig_tlv_data,
{ "data", "ptp.v2.sig.tlv.data",
FT_BYTES, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_sig_tlv_messageType,
{ "messageType", "ptp.v2.sig.tlv.messageType",
FT_UINT8, BASE_HEX | BASE_EXT_STRING, &ptp_v2_messageid_vals_ext, 0xF0,
NULL, HFILL }
},
{ &hf_ptp_v2_sig_tlv_logInterMessagePeriod,
{ "logInterMessagePeriod", "ptp.v2.sig.tlv.logInterMessagePeriod",
FT_INT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_sig_tlv_logInterMessagePeriod_period,
{ "period", "ptp.v2.sig.tlv.logInterMessagePeriod.period",
FT_INT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_sig_tlv_logInterMessagePeriod_rate,
{ "rate", "ptp.v2.sig.tlv.logInterMessagePeriod.rate",
FT_INT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_sig_tlv_durationField,
{ "durationField", "ptp.v2.sig.tlv.durationField",
FT_UINT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_sig_tlv_renewalInvited,
{ "renewalInvited", "ptp.v2.sig.tlv.renewalInvited",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
/* Fields for PTP_Signalling (=sig) TLVs */
{ &hf_ptp_as_sig_tlv_tlvtype,
{ "tlvType", "ptp.as.sig.tlvType",
FT_UINT16, BASE_DEC | BASE_EXT_STRING, &ptp_v2_TLV_type_vals_ext, 0x00,
NULL, HFILL }
},
{ &hf_ptp_as_sig_tlv_lengthfield,
{ "lengthField", "ptp.as.sig.lengthField",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_as_sig_tlv_organization_id,
{ "organizationId", "ptp.as.sig.tlv.organizationId",
FT_UINT24, BASE_HEX, VALS(ptp_as_TLV_oid_vals), 0x00,
NULL, HFILL }
},
{ &hf_ptp_as_sig_tlv_organization_subtype,
{ "OrganizationSubType", "ptp.as.sig.tlv.organizationSubType",
FT_INT24, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_as_sig_tlv_link_delay_interval,
{ "linkDelayInterval", "ptp.as.sig.tlv.linkdelayinterval",
FT_INT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_as_sig_tlv_time_sync_interval,
{ "timeSyncInterval", "ptp.as.sig.tlv.timesyncinterval",
FT_INT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_as_sig_tlv_announce_interval,
{ "announceInterval", "ptp.as.sig.tlv.announceinterval",
FT_INT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_as_sig_tlv_flags,
{ "flags", "ptp.as.sig.tvl.flags",
FT_UINT8, BASE_HEX, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_as_sig_tlv_flags_comp_rate_ratio,
{ "computeNeighborRateRatio", "ptp.as.sig.tlv.flags.rateratio",
FT_BOOLEAN, 8, NULL, PTP_AS_FLAGS_COMP_NEIGHBOR_RATE_RATIO_BITMASK,
NULL, HFILL }
},
{ &hf_ptp_as_sig_tlv_flags_comp_prop_delay,
{ "computeNeighborPropDelay", "ptp.as.sig.tlv.flags.propdelay",
FT_BOOLEAN, 8, NULL, PTP_AS_FLAGS_COMP_NEIGHBOR_PROP_DELAY_BITMASK,
NULL, HFILL }
},
/* Fields for PTP_Management (=mm) messages */
{ &hf_ptp_v2_mm_targetportidentity,
{ "targetPortIdentity", "ptp.v2.mm.targetportidentity",
FT_UINT64, BASE_HEX, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_targetportid,
{ "targetPortId", "ptp.v2.mm.targetportid",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_startingboundaryhops,
{ "startingBoundaryHops", "ptp.v2.mm.startingboundaryhops",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_boundaryhops,
{ "boundaryHops", "ptp.v2.mm.boundaryhops",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_action,
{ "action", "ptp.v2.mm.action",
FT_UINT8, BASE_DEC, VALS(ptp_v2_mm_action_vals), 0x0F,
NULL, HFILL }
},
/* Management TLV */
{ &hf_ptp_v2_mm_tlvType,
{ "tlvType", "ptp.v2.mm.tlvType",
FT_UINT16, BASE_DEC | BASE_EXT_STRING, &ptp_v2_TLV_type_vals_ext, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_lengthField,
{ "lengthField", "ptp.v2.mm.lengthField",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_managementId,
{ "managementId", "ptp.v2.mm.managementId",
FT_UINT16, BASE_DEC | BASE_EXT_STRING, &ptp_v2_managementID_vals_ext, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_data,
{ "data", "ptp.v2.mm.data",
FT_BYTES, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
/* Management TLV dataField */
/* CLOCK_DESCRIPTION */
{ &hf_ptp_v2_mm_clockType,
{ "clockType", "ptp.v2.mm.clockType",
FT_UINT16, BASE_HEX, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_clockType_ordinaryClock,
{ "The node implements an ordinary clock", "ptp.v2.mm.clockType.OC",
FT_BOOLEAN, 16, NULL, CLOCKTYPE_ORDINARY_CLOCK,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_clockType_boundaryClock,
{ "The node implements a boundary clock", "ptp.v2.mm.clockType.BC",
FT_BOOLEAN, 16, NULL, CLOCKTYPE_BOUNDARY_CLOCK,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_clockType_p2p_transparentClock,
{ "The node implements a peer-to-peer transparent clock", "ptp.v2.mm.clockType.p2p_TC",
FT_BOOLEAN, 16, NULL, CLOCKTYPE_P2P_TC,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_clockType_e2e_transparentClock,
{ "The node implements an end-to-end transparent clock", "ptp.v2.mm.clockType.e2e_TC",
FT_BOOLEAN, 16, NULL, CLOCKTYPE_E2E_TC,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_clockType_managementNode,
{ "The node implements a management node", "ptp.v2.mm.clockType.MM",
FT_BOOLEAN, 16, NULL, CLOCKTYPE_MANAGEMENT_NODE,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_clockType_reserved,
{ "Reserved", "ptp.v2.mm.clockType.reserved",
FT_BOOLEAN, 16, NULL, CLOCKTYPE_RESERVED,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_physicalLayerProtocol,
{ "physicalLayerProtocol", "ptp.v2.mm.physicalLayerProtocol",
FT_STRING, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_physicalLayerProtocol_length,
{ "length", "ptp.v2.mm.physicalLayerProtocol.length",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_physicalAddressLength,
{ "physical address length", "ptp.v2.mm.physicalAddressLength",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_physicalAddress,
{ "physical address", "ptp.v2.mm.physicalAddress",
FT_BYTES, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_protocolAddress,
{ "protocol address", "ptp.v2.mm.protocolAddress",
FT_BYTES, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_protocolAddress_networkProtocol,
{ "network protocol", "ptp.v2.mm.networkProtocol",
FT_UINT16, BASE_DEC | BASE_EXT_STRING, &ptp_v2_networkProtocol_vals_ext, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_protocolAddress_length,
{ "length", "ptp.v2.mm.protocolAddress.length",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_manufacturerIdentity,
{ "manufacturer identity", "ptp.v2.mm.manufacturerIdentity",
FT_BYTES, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_reserved,
{ "reserved", "ptp.v2.mm.reserved",
FT_BYTES, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_productDescription,
{ "product description", "ptp.v2.mm.productDescription",
FT_STRING, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_productDescription_length,
{ "length", "ptp.v2.mm.productDescription.length",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_revisionData,
{ "revision data", "ptp.v2.mm.revisionData",
FT_STRING, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_revisionData_length,
{ "length", "ptp.v2.mm.revisionData.length",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_userDescription,
{ "user description", "ptp.v2.mm.userDescription",
FT_STRING, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_userDescription_length,
{ "length", "ptp.v2.mm.userDescription.length",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_profileIdentity,
{ "profileIdentity", "ptp.v2.mm.profileIdentity",
FT_BYTES, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_pad,
{ "Pad", "ptp.v2.mm.pad",
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_initializationKey,
{ "initialization key", "ptp.v2.mm.initializationKey",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_numberOfFaultRecords,
{ "number of fault records", "ptp.v2.mm.numberOfFaultRecords",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
#if 0
{ &hf_ptp_v2_mm_faultRecord,
{ "fault record", "ptp.v2.mm.faultRecord",
FT_BYTES, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
#endif
{ &hf_ptp_v2_mm_faultRecordLength,
{ "fault record length", "ptp.v2.mm.faultRecordLength",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_severityCode,
{ "severity code", "ptp.v2.mm.severityCode",
FT_UINT8, BASE_DEC | BASE_EXT_STRING, &ptp_v2_severityCode_vals_ext, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_faultName,
{ "faultName", "ptp.v2.mm.faultName",
FT_STRING, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_faultName_length,
{ "length", "ptp.v2.mm.faultName.length",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_faultValue,
{ "faultValue", "ptp.v2.mm.faultValue",
FT_STRING, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_faultValue_length,
{ "length", "ptp.v2.mm.faultValue.length",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_faultDescription,
{ "faultDescription", "ptp.v2.mm.faultDescription",
FT_STRING, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_faultDescription_length,
{ "length", "ptp.v2.mm.faultDescription.length",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
#if 0
{ &hf_ptp_v2_mm_faultTime,
{ "Fault time", "ptp.v2.mm.faultTime",
FT_RELATIVE_TIME, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
#endif
{ &hf_ptp_v2_mm_faultTime_s,
{ "Fault time (seconds)", "ptp.v2.mm.faultTime.seconds",
FT_UINT64, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_faultTime_ns,
{ "Fault time (nanoseconds)", "ptp.v2.mm.faultTime.nanoseconds",
FT_INT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_currentTime_s,
{ "current time (seconds)", "ptp.v2.mm.currentTime.seconds",
FT_UINT64, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_currentTime_ns,
{ "current time (nanoseconds)", "ptp.v2.mm.currentTime.nanoseconds",
FT_INT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_clockAccuracy,
{ "Clock accuracy", "ptp.v2.mm.clockaccuracy",
FT_UINT8, BASE_HEX | BASE_EXT_STRING, &ptp_v2_clockAccuracy_vals_ext, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_priority1,
{ "priority1", "ptp.v2.mm.priority1",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_priority2,
{ "priority2", "ptp.v2.mm.priority2",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_dds_SO,
{ "Slave only", "ptp.v2.mm.SlavOnly",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_TSC,
{ "Two step", "ptp.v2.mm.twoStep",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_numberPorts,
{ "number of ports", "ptp.v2.mm.numberPorts",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_clockclass,
{ "Clock class", "ptp.v2.mm.clockclass",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_clockaccuracy,
{ "Clock accuracy", "ptp.v2.mm.clockaccuracy",
FT_UINT8, BASE_HEX | BASE_EXT_STRING, &ptp_v2_clockAccuracy_vals_ext, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_clockvariance,
{ "Clock variance", "ptp.v2.mm.clockvariance",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_clockidentity,
{ "Clock identity", "ptp.v2.mm.clockidentity",
FT_UINT64, BASE_HEX, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_domainNumber,
{ "domain number", "ptp.v2.mm.domainNumber",
FT_UINT8, BASE_DEC, NULL , 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_SO,
{ "Slave only", "ptp.v2.mm.SlavOnly",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_stepsRemoved,
{ "steps removed", "ptp.v2.mm.stepsRemoved",
FT_INT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_parentIdentity,
{ "parent ClockIdentity", "ptp.v2.mm.parentclockidentity",
FT_UINT64, BASE_HEX, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_parentPort,
{ "parent SourcePortID", "ptp.v2.mm.parentsourceportid",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_parentStats,
{ "parent stats", "ptp.v2.mm.parentstats",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_observedParentOffsetScaledLogVariance,
{ "observedParentOffsetScaledLogVariance", "ptp.v2.mm.observedParentOffsetScaledLogVariance",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_observedParentClockPhaseChangeRate,
{ "observedParentClockPhaseChangeRate", "ptp.v2.mm.observedParentClockPhaseChangeRate",
FT_INT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_grandmasterPriority1,
{ "Grandmaster priority1", "ptp.v2.mm.grandmasterPriority1",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_grandmasterPriority2,
{ "Grandmaster priority2", "ptp.v2.mm.grandmasterPriority2",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_grandmasterclockclass,
{ "Grandmaster clock class", "ptp.v2.mm.grandmasterclockclass",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_grandmasterclockaccuracy,
{ "Grandmaster clock accuracy", "ptp.v2.mm.grandmasterclockaccuracy",
FT_UINT8, BASE_HEX | BASE_EXT_STRING, &ptp_v2_clockAccuracy_vals_ext, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_grandmasterclockvariance,
{ "Grandmaster clock variance", "ptp.v2.mm.grandmasterclockvariance",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_grandmasterIdentity,
{ "Grandmaster clock identity", "ptp.v2.mm.grandmasterclockidentity",
FT_UINT64, BASE_HEX, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_currentUtcOffset,
{ "CurrentUTCOffset", "ptp.v2.mm.currentutcoffset",
FT_INT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_LI_61,
{ "leap 61", "ptp.v2.mm.li61",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_LI_59,
{ "leap 59", "ptp.v2.mm.li59",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_UTCV,
{ "CurrentUTCOffset valid", "ptp.v2.mm.CurrentUTCOffsetValid",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_PTP,
{ "PTP timescale", "ptp.v2.mm.ptptimescale",
FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_TTRA,
{ "Time traceable", "ptp.v2.mm.timeTraceable",
FT_BOOLEAN, 8, NULL, 0x10,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_FTRA,
{ "Frequency traceable", "ptp.v2.mm.frequencyTraceable",
FT_BOOLEAN, 8, NULL, 0x20,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_timesource,
{ "TimeSource", "ptp.v2.mm.timesource",
FT_UINT8, BASE_HEX | BASE_EXT_STRING, &ptp_v2_timeSource_vals_ext, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_offset_ns,
{ "correction", "ptp.v2.mm.offset.ns",
FT_UINT64, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_offset_subns,
{ "SubNs", "ptp.v2.mm.offset.subns",
FT_DOUBLE, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_pathDelay_ns,
{ "ns", "ptp.v2.mm.pathDelay.ns",
FT_UINT64, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_pathDelay_subns,
{ "SubNs", "ptp.v2.mm.pathDelay.subns",
FT_DOUBLE, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_PortNumber,
{ "PortNumber", "ptp.v2.mm.PortNumber",
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_portState,
{ "Port state", "ptp.v2.mm.portState",
FT_UINT8, BASE_DEC | BASE_EXT_STRING, &ptp_v2_portState_vals_ext, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_logMinDelayReqInterval,
{ "logMinDelayReqInterval", "ptp.v2.mm.logMinDelayReqInterval",
FT_INT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_peerMeanPathDelay_ns,
{ "ns", "ptp.v2.mm.peerMeanPathDelay.ns",
FT_UINT64, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_peerMeanPathDelay_subns,
{ "SubNs", "ptp.v2.mm.peerMeanPathDelay.subns",
FT_DOUBLE, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_logAnnounceInterval,
{ "logAnnounceInterval", "ptp.v2.mm.logAnnounceInterval",
FT_INT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_announceReceiptTimeout,
{ "announceReceiptTimeout", "ptp.v2.mm.announceReceiptTimeout",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_logSyncInterval,
{ "logSyncInterval", "ptp.v2.mm.logSyncInterval",
FT_INT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_delayMechanism,
{ "Delay mechanism", "ptp.v2.mm.delayMechanism",
FT_UINT8, BASE_DEC, VALS(ptp_v2_delayMechanism_vals), 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_logMinPdelayReqInterval,
{ "logMinPdelayReqInterval", "ptp.v2.mm.logMinPdelayReqInterval",
FT_INT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_versionNumber,
{ "versionNumber", "ptp.v2.mm.versionNumber",
FT_UINT8, BASE_DEC, NULL, 0x0F,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_primaryDomain,
{ "Primary domain number", "ptp.v2.mm.primaryDomain",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_faultyFlag,
{ "Faulty flag", "ptp.v2.mm.faultyFlag",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_managementErrorId,
{ "managementErrorId", "ptp.v2.mm.managementErrorId",
FT_UINT16, BASE_DEC | BASE_EXT_STRING, &ptp_v2_managementErrorId_vals_ext, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_displayData,
{ "Display data", "ptp.v2.mm.displayData",
FT_STRING, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_displayData_length,
{ "length", "ptp.v2.mm.displayData.length",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_ucEN,
{ "Enable unicast", "ptp.v2.mm.unicastEnable",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_ptEN,
{ "Path trace unicast", "ptp.v2.mm.pathTraceEnable",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_atEN,
{ "Path trace unicast", "ptp.v2.mm.pathTraceEnable",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_keyField,
{ "Key field", "ptp.v2.mm.keyField",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_displayName,
{ "Display name", "ptp.v2.mm.displayName",
FT_STRING, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_displayName_length,
{ "length", "ptp.v2.mm.displayName.length",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_maxKey,
{ "Max key", "ptp.v2.mm.maxKey",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_currentOffset,
{ "Current offset", "ptp.v2.mm.currentOffset",
FT_INT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_jumpSeconds,
{ "Jump seconds", "ptp.v2.mm.jumpSeconds",
FT_INT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_nextjumpSeconds,
{ "Time of next jump (seconds)", "ptp.v2.mm.nextjumpSeconds",
FT_UINT64, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_numberOfAlternateMasters,
{ "Number of alternate masters", "ptp.v2.mm.numberOfAlternateMasters",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_logAlternateMulticastSyncInterval,
{ "Alternate multicast sync interval", "ptp.v2.mm.AlternateMulticastSyncInterval",
FT_INT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_mm_transmitAlternateMulticastSync,
{ "Transmit alternate multicast sync", "ptp.v2.mm.transmitAlternateMulticastSync",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
{ &hf_ptp_v2_oe_tlv_smpte_subtype,
{ "SMPTE SubType", "ptp.v2.oe.smpte.SubType",
FT_UINT24, BASE_HEX, VALS(ptp_v2_org_smpte_subtype_vals), 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_oe_tlv_subtype_smpte_data,
{ "SMPTE Data", "ptp.v2.oe.smpte.data",
FT_NONE, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_oe_tlv_subtype_smpte_defaultsystemframerate,
{ "defaultSystemFramerate", "ptp.v2.oe.smpte.defaultsystemframerate",
FT_BYTES, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_oe_tlv_subtype_smpte_defaultsystemframerate_numerator,
{ "Numerator", "ptp.v2.oe.smpte.defaultsystemframerate.numerator",
FT_UINT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_oe_tlv_subtype_smpte_defaultsystemframerate_denominator,
{ "Denominator", "ptp.v2.oe.smpte.defaultsystemframerate.denominator",
FT_UINT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_oe_tlv_subtype_smpte_masterlockingstatus,
{ "masterLockingStatus", "ptp.v2.oe.smpte.masterlockingstatus",
FT_UINT8, BASE_DEC, VALS(ptp_v2_org_smpte_subtype_masterlockingstatus_vals), 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_oe_tlv_subtype_smpte_timeaddressflags,
{ "timeAdressFlags", "ptp.v2.oe.smpte.timeadressflags",
FT_UINT8, BASE_HEX, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_oe_tlv_subtype_smpte_timeaddressflags_drop,
{ "Drop frame", "ptp.v2.oe.smpte.timeadressflags.drop",
FT_BOOLEAN, 8, TFS(&tfs_inuse_not_inuse), PTP_V2_FLAGS_OE_SMPTE_TIME_ADRESS_FIELD_DROP,
NULL, HFILL }
},
{ &hf_ptp_v2_oe_tlv_subtype_smpte_timeaddressflags_color,
{ "Color frame identification", "ptp.v2.oe.smpte.timeadressflags.color",
FT_BOOLEAN, 8, TFS(&tfs_inuse_not_inuse), PTP_V2_FLAGS_OE_SMPTE_TIME_ADRESS_FIELD_COLOR,
NULL, HFILL }
},
{ &hf_ptp_v2_oe_tlv_subtype_smpte_currentlocaloffset,
{ "currentLocalOffset", "ptp.v2.oe.smpte.currentlocaloffset",
FT_INT32, BASE_DEC, NULL, 0x00,
"Offset in seconds of Local Time from grandmaster PTP time", HFILL }
},
{ &hf_ptp_v2_oe_tlv_subtype_smpte_jumpseconds,
{ "jumpSeconds", "ptp.v2.oe.smpte.jumpseconds",
FT_INT32, BASE_DEC, NULL, 0x00,
"Size of next discontinuity, in seconds, of Local Time", HFILL }
},
{ &hf_ptp_v2_oe_tlv_subtype_smpte_timeofnextjump,
{ "timeOfNextJump", "ptp.v2.oe.smpte.timeofnextjump",
FT_UINT48, BASE_DEC, NULL, 0x00,
"Value of the seconds portion at the time that the next discontinuity of the currentLocalOffset will occur", HFILL }
},
{ &hf_ptp_v2_oe_tlv_subtype_smpte_timeofnextjam,
{ "timeOfNextJam", "ptp.v2.oe.smpte.timeofnextjam",
FT_UINT48, BASE_DEC, NULL, 0x00,
"Value of the seconds portion to the next scheduled Daily Jam", HFILL }
},
{ &hf_ptp_v2_oe_tlv_subtype_smpte_timeofpreviousjam,
{ "timeOfPreviousJam", "ptp.v2.oe.smpte.timeofpreviousjam",
FT_UINT48, BASE_DEC, NULL, 0x00,
"Value of the seconds portion of the previous Daily Jam", HFILL }
},
{ &hf_ptp_v2_oe_tlv_subtype_smpte_previousjamlocaloffset,
{ "previousJamLocalOffset", "ptp.v2.oe.smpte.previousjamlocaloffset",
FT_INT32, BASE_DEC, NULL, 0x00,
"Value of current LocalOffset at the time of the previous Daily Jam", HFILL }
},
{ &hf_ptp_v2_oe_tlv_subtype_smpte_daylightsaving,
{ "daylightSaving", "ptp.v2.oe.smpte.daylightsaving",
FT_UINT8, BASE_HEX, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_oe_tlv_subtype_smpte_daylightsaving_current,
{ "Current", "ptp.v2.oe.smpte.daylightsaving.current",
FT_BOOLEAN, 8, TFS(&tfs_used_notused), PTP_V2_FLAGS_OE_SMPTE_DAYLIGHT_SAVING_CURRENT,
NULL, HFILL }
},
{ &hf_ptp_v2_oe_tlv_subtype_smpte_daylightsaving_next,
{ "Next", "ptp.v2.oe.smpte.daylightsaving.next",
FT_BOOLEAN, 8, TFS(&tfs_used_notused), PTP_V2_FLAGS_OE_SMPTE_DAYLIGHT_SAVING_NEXT,
NULL, HFILL }
},
{ &hf_ptp_v2_oe_tlv_subtype_smpte_daylightsaving_previous,
{ "Previous", "ptp.v2.oe.smpte.daylightsaving.previous",
FT_BOOLEAN, 8, TFS(&tfs_used_notused), PTP_V2_FLAGS_OE_SMPTE_DAYLIGHT_SAVING_PREVIOUS,
NULL, HFILL }
},
{ &hf_ptp_v2_oe_tlv_subtype_smpte_leapsecondjump,
{ "leapSecondJump", "ptp.v2.oe.smpte.leapsecondjump",
FT_UINT8, BASE_HEX, NULL, 0x00,
NULL, HFILL }
},
{ &hf_ptp_v2_oe_tlv_subtype_smpte_leapsecondjump_change,
{ "Change in number", "ptp.v2.oe.smpte.leaspsecondjump",
FT_BOOLEAN, 8, TFS(&tfs_set_notset), PTP_V2_FLAGS_OE_SMPTE_LEAP_SECOND_JUMP_CHANGE,
NULL, HFILL }
},
};
/* Setup protocol subtree array */
static gint *ett[] = {
&ett_ptp,
&ett_ptp_flags,
&ett_ptp_time,
&ett_ptp_time2,
&ett_ptp_v2,
&ett_ptp_v2_transportspecific,
&ett_ptp_v2_flags,
&ett_ptp_v2_correction,
&ett_ptp_v2_time,
&ett_ptp_v2_time2,
&ett_ptp_v2_managementData,
&ett_ptp_v2_clockType,
&ett_ptp_v2_physicalLayerProtocol,
&ett_ptp_v2_protocolAddress,
&ett_ptp_v2_ptptext,
&ett_ptp_v2_faultRecord,
&ett_ptp_v2_timeInterval,
&ett_ptp_v2_tlv,
&ett_ptp_v2_tlv_log_period,
&ett_ptp_as_sig_tlv_flags,
&ett_ptp_oe_smpte_data,
&ett_ptp_oe_smpte_framerate,
&ett_ptp_oe_smpte_timeaddress,
&ett_ptp_oe_smpte_daylightsaving,
&ett_ptp_oe_smpte_leapsecondjump,
};
static ei_register_info ei[] = {
{ &ei_ptp_v2_msg_len_too_large, { "ptp.v2.msg_len_too_large", PI_MALFORMED, PI_ERROR, "Message length goes past the end of the packet", EXPFILL }},
{ &ei_ptp_v2_msg_len_too_small, { "ptp.v2.msg_len_too_small", PI_MALFORMED, PI_ERROR, "Message length too short to include the message length field", EXPFILL }},
};
expert_module_t* expert_ptp;
/* Register the protocol name and description */
proto_ptp = proto_register_protocol("Precision Time Protocol (IEEE1588)",
"PTP", "ptp");
/* Required function calls to register the header fields and subtrees used */
proto_register_field_array(proto_ptp, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
expert_ptp = expert_register_protocol(proto_ptp);
expert_register_field_array(expert_ptp, ei, array_length(ei));
}
void
proto_reg_handoff_ptp(void)
{
dissector_handle_t ptp_handle;
dissector_handle_t ethertype_ptp_handle;
ptp_handle = create_dissector_handle(dissect_ptp, proto_ptp);
ethertype_ptp_handle = create_dissector_handle(dissect_ptp_oE, proto_ptp);
dissector_add_uint_range_with_preference("udp.port", PTP_PORT_RANGE, ptp_handle);
dissector_add_uint("ethertype", ETHERTYPE_PTP, ethertype_ptp_handle);
}
/*
* Editor modelines - http://www.wireshark.org/tools/modelines.html
*
* Local variables:
* c-basic-offset: 4
* tab-width: 8
* indent-tabs-mode: nil
* End:
*
* vi: set shiftwidth=4 tabstop=8 expandtab:
* :indentSize=4:tabSize=8:noTabs=true:
*/