/* packet-ptp.c * Routines for PTP (Precision Time Protocol) dissection * Copyright 2004, Auges Tchouante * Copyright 2004, Dominic Bechaz , ZHW/InES * Copyright 2004, Markus Seehofer * Copyright 2006, Christian Schaer * Copyright 2007, Markus Renz * Copyright 2010, Torrey Atcitty * Dave Olsen * Copyright 2013, Andreas Bachmann , ZHAW/InES * Copyright 2016, Uli Heilmeier * * Revisions: * - Markus Seehofer 09.08.2005 * - Included the "startingBoundaryHops" field in * ptp_management messages. * - Christian Schaer 07.07.2006 * - 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 * - allow multiple TLVs * - bugfix in logInterMessagePeriod guint8 -> gint8 * - Uli Heilmeier 21.03.2016 * - Added support for SMPTE TLV * * Wireshark - Network traffic analyzer * By Gerald Combs * 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 #include #include #include #include #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(ptptimeInterval_subtree, hf_ptp_v2_timeInterval_subns, tvb, *cur_offset+6, 2, (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; 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 */ proto_tree_add_item(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, ENC_BIG_ENDIAN); 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 */ proto_tree_add_item(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, ENC_BIG_ENDIAN); /* 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|BASE_UNIT_STRING, &units_nanosecond_nanoseconds, 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|BASE_UNIT_STRING, &units_second_seconds, 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|BASE_UNIT_STRING, &units_nanosecond_nanoseconds, 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|BASE_UNIT_STRING, &units_nanosecond_nanoseconds, 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|BASE_UNIT_STRING, &units_nanosecond_nanoseconds, 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: */