From Torrey Atcitty: [Dissector Enhancement] Added new functionality to existing 1588v2 dissector to also support IEEE802.1AS.

svn path=/trunk/; revision=32796
This commit is contained in:
Bill Meier 2010-05-13 21:47:38 +00:00
parent e00323a55f
commit 44b53b4a50
2 changed files with 410 additions and 38 deletions

View File

@ -3033,6 +3033,15 @@ Robert Hogan <robert [AT] roberthogan.net> {
TN3270 fixes
}
Torrey Atcitty <torrey.atcitty [AT] harman.com> {
PTP dissector: Added support for 802.1AS D7.0
}
Dave Olsen <dave.olsen [AT] harman.com> {
PTP dissector: Added support for 802.1AS D7.0
}
and by:
Pavel Roskin <proski [AT] gnu.org>

View File

@ -5,6 +5,8 @@
* Copyright 2004, Markus Seehofer <mseehofe@nt.hirschmann.de>
* Copyright 2006, Christian Schaer <scc@zhwin.ch>
* Copyright 2007, Markus Renz <Markus.Renz@hirschmann.de>
* Copyright 2010, Torrey Atcitty <torrey.atcitty@harman.com>
* Dave Olsen <dave.olsen@harman.com>
*
* Revisions:
* - Markus Seehofer 09.08.2005 <mseehofe@nt.hirschmann.de>
@ -13,8 +15,10 @@
* - Christian Schaer 07.07.2006 <scc@zhwin.ch>
* - Added support for PTP version 2
* - Markus Renz 2007-06-01
* updated support for PTPv2
* - Markus Renz added Management for PTPv2, update to Draft 2.2
* - 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
*
* $Id$
*
@ -712,29 +716,47 @@ static gint ett_ptp_time2 = -1;
#define PTP_V2_AN_LOCALSTEPSREMOVED_OFFSET 61
#define PTP_V2_AN_TIMESOURCE_OFFSET 63
#define PTP_V2_AN_TLV_OFFSET 64
/* Announce TLV field offsets */
#define PTP_V2_AN_TLV_TYPE_OFFSET 0
#define PTP_V2_AN_TLV_LENGTHFIELD_OFFSET 2
/* 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
@ -742,14 +764,12 @@ static gint ett_ptp_time2 = -1;
#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
@ -770,6 +790,24 @@ static gint ett_ptp_time2 = -1;
#define PTP_V2_SIG_TARGETPORTIDENTITY_OFFSET 34
#define PTP_V2_SIG_TARGETPORTID_OFFSET 42
/* 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
@ -803,6 +841,9 @@ static gint ett_ptp_time2 = -1;
#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
@ -872,6 +913,7 @@ static gint ett_ptp_time2 = -1;
#define PTP_V2_TRANSPORTSPECIFIC_V1COMPATIBILITY_BITMASK 0x10
#define PTP_V2_TRANSPORTSPECIFIC_ASPACKET_BITMASK 0x10
/**********************************************************/
@ -1025,6 +1067,9 @@ static const value_string ptp_v2_TLV_type_vals[] = {
{PTP_V2_TLV_TYPE_CUM_FREQ_SCALE_FACTOR_OFFSET ,"Cum. freq. scale factor offset"},
{0 , NULL} };
static const value_string ptp_as_TLV_oid_vals[] = {
{PTP_AS_TLV_OID_TYPE_802 ,"IEEE 802"},
{0 , NULL} };
static const value_string ptp2_networkProtocol_vals[] = {
{0x0000, "Reserved"},
@ -1207,6 +1252,8 @@ 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;
@ -1221,7 +1268,15 @@ static int hf_ptp_v2_sdr_origintimestamp_nanoseconds = -1;
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_phase_change = -1;
/*Fields for PTP_DelayResponse (=dr) messages*/
static int hf_ptp_v2_dr_receivetimestamp = -1; /*Field for seconds & nanoseconds*/
@ -1256,7 +1311,17 @@ 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;
/* 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;
@ -1394,12 +1459,13 @@ 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_as_sig_tlv_flags = -1;
/* static gint ett_ptp_v2_timesource = -1;
static gint ett_ptp_v2_priority = -1; */
static gint ett_ptp_v2_transportspecific = -1;
/* For tronsport specific field Ethernet or UDP */
/* For transport specific field Ethernet or UDP */
static gboolean ptpv2_oE = FALSE;
/* END Definitions and fields for PTPv2 dissection. */
@ -2200,6 +2266,7 @@ dissect_ptp_v2_timeInterval(tvbuff_t *tvb, guint16 *cur_offset, proto_tree *tree
static void
dissect_ptp_v2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
guint8 ptp_v2_transport_specific = 0;
guint8 ptp_v2_messageid = 0;
guint16 ptp_v2_mm_managementId = 0;
guint8 ptp_v2_management_action = 0;
@ -2215,8 +2282,10 @@ dissect_ptp_v2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
/* Make entries in Protocol column and Info column on summary display */
col_set_str(pinfo->cinfo, COL_PROTOCOL, "PTPv2");
/* Get control field (what kind of message is this? (Sync, DelayReq, ...) */
/* 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);
/* Extend Info column with managementId */
@ -2360,15 +2429,19 @@ dissect_ptp_v2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
proto_item *tlv_ti;
proto_tree *ptp_tlv_tree;
timeStamp = tvb_get_ntohl(tvb, PTP_V2_AN_ORIGINTIMESTAMPSECONDS_OFFSET);
timeStamp = timeStamp << 16;
timeStamp = timeStamp | tvb_get_ntohs(tvb, PTP_V2_AN_ORIGINTIMESTAMPSECONDS_OFFSET+4);
/* 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, FALSE);
proto_tree_add_item(ptp_tree, hf_ptp_v2_an_origintimestamp_nanoseconds, tvb,
PTP_V2_AN_ORIGINTIMESTAMPNANOSECONDS_OFFSET, 4, FALSE);
timeStamp = tvb_get_ntohl(tvb, PTP_V2_AN_ORIGINTIMESTAMPSECONDS_OFFSET);
timeStamp = timeStamp << 16;
timeStamp = timeStamp | tvb_get_ntohs(tvb, PTP_V2_AN_ORIGINTIMESTAMPSECONDS_OFFSET+4);
proto_tree_add_item(ptp_tree, hf_ptp_v2_an_origintimestamp_seconds, tvb,
PTP_V2_AN_ORIGINTIMESTAMPSECONDS_OFFSET, 6, FALSE);
proto_tree_add_item(ptp_tree, hf_ptp_v2_an_origintimestamp_nanoseconds, tvb,
PTP_V2_AN_ORIGINTIMESTAMPNANOSECONDS_OFFSET, 4, FALSE);
}
proto_tree_add_item(ptp_tree, hf_ptp_v2_an_origincurrentutcoffset, tvb,
PTP_V2_AN_ORIGINCURRENTUTCOFFSET_OFFSET, 2, FALSE);
@ -2471,6 +2544,19 @@ dissect_ptp_v2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
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, FALSE);
}
break;
}
default:
{
proto_tree_add_item(ptp_tlv_tree,
@ -2505,6 +2591,11 @@ dissect_ptp_v2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
case PTP_V2_FOLLOWUP_MESSAGE:{
guint16 tlv_type;
guint16 tlv_length;
proto_item *tlv_ti;
proto_tree *ptp_tlv_tree;
timeStamp = tvb_get_ntohl(tvb, PTP_V2_FU_PRECISEORIGINTIMESTAMPSECONDS_OFFSET);
timeStamp = timeStamp << 16;
timeStamp = timeStamp | tvb_get_ntohs(tvb, PTP_V2_FU_PRECISEORIGINTIMESTAMPSECONDS_OFFSET+4);
@ -2515,6 +2606,81 @@ dissect_ptp_v2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
proto_tree_add_item(ptp_tree, hf_ptp_v2_fu_preciseorigintimestamp_nanoseconds, tvb,
PTP_V2_FU_PRECISEORIGINTIMESTAMPNANOSECONDS_OFFSET, 4, FALSE);
/* 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_type = tvb_get_ntohs (tvb, PTP_AS_FU_TLV_INFORMATION_OFFSET + PTP_AS_FU_TLV_TYPE_OFFSET);
tlv_length = tvb_get_ntohs (tvb, PTP_AS_FU_TLV_INFORMATION_OFFSET + PTP_AS_FU_TLV_LENGTHFIELD_OFFSET);
tlv_ti = proto_tree_add_text(
ptp_tree,
tvb,
PTP_AS_FU_TLV_INFORMATION_OFFSET,
tlv_length + PTP_AS_FU_TLV_ORGANIZATIONID_OFFSET,
"%s TLV",
"Follow Up information");
ptp_tlv_tree = proto_item_add_subtree(tlv_ti, ett_ptp_v2_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,
FALSE);
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,
FALSE);
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,
FALSE);
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,
FALSE);
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,
FALSE);
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,
FALSE);
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,
FALSE);
proto_tree_add_item(ptp_tlv_tree,
hf_ptp_as_fu_tlv_scaled_last_gm_phase_change,
tvb,
PTP_AS_FU_TLV_INFORMATION_OFFSET + PTP_AS_FU_TLV_SCALEDLASTGMFREQCHANGE_OFFSET,
4,
FALSE);
}
break;
}
@ -2539,15 +2705,19 @@ dissect_ptp_v2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
case PTP_V2_PATH_DELAY_REQ_MESSAGE:{
timeStamp = tvb_get_ntohl(tvb, PTP_V2_PDRQ_ORIGINTIMESTAMPSECONDS_OFFSET);
timeStamp = timeStamp << 16;
timeStamp = timeStamp | tvb_get_ntohs(tvb, PTP_V2_PDRQ_ORIGINTIMESTAMPSECONDS_OFFSET+4);
/* 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, FALSE);
timeStamp = tvb_get_ntohl(tvb, PTP_V2_PDRQ_ORIGINTIMESTAMPSECONDS_OFFSET);
timeStamp = timeStamp << 16;
timeStamp = timeStamp | tvb_get_ntohs(tvb, PTP_V2_PDRQ_ORIGINTIMESTAMPSECONDS_OFFSET+4);
proto_tree_add_item(ptp_tree, hf_ptp_v2_pdrq_origintimestamp_nanoseconds, tvb,
PTP_V2_PDRQ_ORIGINTIMESTAMPNANOSECONDS_OFFSET, 4, FALSE);
proto_tree_add_item(ptp_tree, hf_ptp_v2_pdrq_origintimestamp_seconds, tvb,
PTP_V2_PDRQ_ORIGINTIMESTAMPSECONDS_OFFSET, 6, FALSE);
proto_tree_add_item(ptp_tree, hf_ptp_v2_pdrq_origintimestamp_nanoseconds, tvb,
PTP_V2_PDRQ_ORIGINTIMESTAMPNANOSECONDS_OFFSET, 4, FALSE);
}
break;
}
@ -2594,8 +2764,9 @@ dissect_ptp_v2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
case PTP_V2_SIGNALLING_MESSAGE:{
guint16 tlv_type, 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, FALSE);
@ -2603,22 +2774,115 @@ dissect_ptp_v2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
proto_tree_add_item(ptp_tree, hf_ptp_v2_sig_targetportid, tvb,
PTP_V2_SIG_TARGETPORTID_OFFSET, 2, FALSE);
proto_tree_add_item(ptp_tree, hf_ptp_v2_mm_tlvType, tvb,
PTP_V2_SIG_TARGETPORTID_OFFSET+2, 2, FALSE);
/* 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_type = tvb_get_ntohs (tvb, PTP_AS_SIG_TLV_MESSAGEINTERVALREQUEST_OFFSET + PTP_AS_SIG_TLV_TYPE_OFFSET);
tlv_length = tvb_get_ntohs (tvb, PTP_AS_SIG_TLV_MESSAGEINTERVALREQUEST_OFFSET + PTP_AS_SIG_TLV_LENGTHFIELD_OFFSET);
proto_tree_add_item(ptp_tree, hf_ptp_v2_mm_lengthField, tvb,
PTP_V2_SIG_TARGETPORTID_OFFSET+4, 2, FALSE);
tlv_ti = proto_tree_add_text(
ptp_tree,
tvb,
PTP_AS_SIG_TLV_MESSAGEINTERVALREQUEST_OFFSET,
tlv_length + PTP_AS_SIG_TLV_ORGANIZATIONID_OFFSET,
"%s TLV",
"Message Interval Request");
tlv_type = tvb_get_ntohs (tvb, PTP_V2_MM_TLV_TYPE_OFFSET);
tlv_length = tvb_get_ntohs (tvb, PTP_V2_MM_TLV_LENGTHFIELD_OFFSET);
ptp_tlv_tree = proto_item_add_subtree(tlv_ti, ett_ptp_v2_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,
FALSE);
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,
FALSE);
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,
FALSE);
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,
FALSE);
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,
FALSE);
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,
FALSE);
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,
FALSE);
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,
FALSE);
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,
FALSE);
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,
FALSE);
if (tlv_length <= 2)
{
/* no data */
break;
}
/* ToDO: Add dissector for TLVs and allow multiple TLVs */
proto_tree_add_text(ptp_tree, tvb, PTP_V2_SIG_TARGETPORTID_OFFSET+6, tlv_length, "Data");
else {
proto_tree_add_item(ptp_tree, hf_ptp_v2_mm_tlvType, tvb,
PTP_V2_SIG_TARGETPORTID_OFFSET+2, 2, FALSE);
proto_tree_add_item(ptp_tree, hf_ptp_v2_mm_lengthField, tvb,
PTP_V2_SIG_TARGETPORTID_OFFSET+4, 2, FALSE);
tlv_type = tvb_get_ntohs (tvb, PTP_V2_MM_TLV_TYPE_OFFSET);
tlv_length = tvb_get_ntohs (tvb, PTP_V2_MM_TLV_LENGTHFIELD_OFFSET);
if (tlv_length <= 2)
{
/* no data */
break;
}
/* ToDO: Add dissector for TLVs and allow multiple TLVs */
proto_tree_add_text(ptp_tree, tvb, PTP_V2_SIG_TARGETPORTID_OFFSET+6, tlv_length, "Data");
}
break;
}
@ -4469,6 +4733,12 @@ proto_register_ptp(void)
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,
@ -4510,6 +4780,47 @@ proto_register_ptp(void)
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, VALS(ptp_v2_TLV_type_vals), 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_phase_change,
{ "scaledLastGMPhaseChange", "ptp.as.fu.scaledLastGmPhaseChange",
FT_INT32, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
/*Fields for PTP_DelayResponse (=dr) messages*/
{ &hf_ptp_v2_dr_receivetimestamp,
@ -4620,7 +4931,58 @@ proto_register_ptp(void)
FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }
},
/*Fields for PTP_Signalling (=sig) TLVs */
{ &hf_ptp_as_sig_tlv_tlvtype,
{ "tlvType", "ptp.as.sig.tlvType",
FT_UINT16, BASE_DEC, VALS(ptp_v2_TLV_type_vals), 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",
@ -5215,6 +5577,7 @@ proto_register_ptp(void)
&ett_ptp_v2_faultRecord,
&ett_ptp_v2_timeInterval,
&ett_ptp_v2_tlv,
&ett_ptp_as_sig_tlv_flags,
};
/* Register the protocol name and description */