Don't speak of RTPS time_t as an "NTP" time.

It's some weird hybrid of UN*X time and NTP time stamps, using UN*X's
epoch and NTP's seconds/fractions split.  I'm sure they had their
reasons for not using something like struct timespec or regular NTP
time, and instead inventing something that's halfway in between them.

Change-Id: I1f39ec1368af52b82adfa2a22677dfa6e9341309
Reviewed-on: https://code.wireshark.org/review/20711
Reviewed-by: Guy Harris <guy@alum.mit.edu>
This commit is contained in:
Guy Harris 2017-03-25 21:58:47 -07:00
parent a6730565f8
commit bb2ab6ac96
3 changed files with 74 additions and 65 deletions

View File

@ -67,7 +67,7 @@ void proto_reg_handoff_rtps(void);
#define MAX_GUID_SIZE (160)
#define MAX_VENDOR_ID_SIZE (128)
#define MAX_PARAM_SIZE (256)
#define MAX_NTP_TIME_SIZE (128)
#define MAX_TIMESTAMP_SIZE (128)
static const char *const SM_EXTRA_RPLUS = "(r+)";
static const char *const SM_EXTRA_RMINUS = "(r-)";
@ -268,8 +268,8 @@ static int hf_rtps_pgm_data_holder_class_id = -1;
/* static int hf_rtps_pgm_data_holder_stringseq_name = -1; */
/* static int hf_rtps_pgm_data_holder_long_long = -1; */
static int hf_rtps_param_ntpt_sec = -1;
static int hf_rtps_param_ntpt_fraction = -1;
static int hf_rtps_param_timestamp_sec = -1;
static int hf_rtps_param_timestamp_fraction = -1;
static int hf_rtps_transportInfo_classId = -1;
static int hf_rtps_transportInfo_messageSizeMax = -1;
static int hf_rtps_param_app_ack_count = -1;
@ -451,7 +451,7 @@ static gint ett_rtps_app_id = -1;
static gint ett_rtps_locator_udp_v4 = -1;
static gint ett_rtps_locator = -1;
static gint ett_rtps_locator_list = -1;
static gint ett_rtps_ntp_time = -1;
static gint ett_rtps_timestamp = -1;
static gint ett_rtps_bitmap = -1;
static gint ett_rtps_seq_string = -1;
static gint ett_rtps_seq_ulong = -1;
@ -2173,30 +2173,35 @@ static void rtps_util_add_transport_info(proto_tree *tree,
}
/* ------------------------------------------------------------------------- */
/* Insert in the protocol tree the next 8 bytes interpreted as NtpTime
/* Insert in the protocol tree the next 8 bytes interpreted as an RTPS time_t,
* which is like an NTP time stamp, except that it uses the UNIX epoch,
* rather than the NTP epoch, as the time base. Doesn't check for TIME_ZERO,
* TIME_INVALID, or TIME_INFINITE, and doesn't show the seconds and
* fraction field separately.
*/
void rtps_util_add_ntp_time(proto_tree *tree,
void rtps_util_add_timestamp(proto_tree *tree,
tvbuff_t *tvb,
gint offset,
const guint encoding,
int hf_time) {
/* ENC_TIME_NTP_BASE_ZERO applies the BASETIME specified by the standard (zero)*/
proto_tree_add_item(tree, hf_time, tvb, offset, 8,
ENC_TIME_NTP_BASE_ZERO|encoding);
ENC_TIME_RTPS|encoding);
}
/* ------------------------------------------------------------------------- */
/* Insert in the protocol tree the next 8 bytes interpreted as NtpTime
*/
static void rtps_util_add_ntp_time_sec_and_fraction(proto_tree *tree,
/* Insert in the protocol tree the next 8 bytes interpreted as an RTPS time_t.
* Checks for special values except for TIME_INVALID, and shows the
* seconds and fraction as separate fields.
*/
static void rtps_util_add_timestamp_sec_and_fraction(proto_tree *tree,
tvbuff_t *tvb,
gint offset,
const guint encoding,
int hf_time _U_) {
guint8 tempBuffer[MAX_NTP_TIME_SIZE];
guint8 tempBuffer[MAX_TIMESTAMP_SIZE];
gdouble absolute;
gint32 sec;
guint32 frac;
@ -2208,20 +2213,20 @@ static void rtps_util_add_ntp_time_sec_and_fraction(proto_tree *tree,
frac = tvb_get_guint32(tvb, offset+4, encoding);
if ((sec == 0x7fffffff) && (frac == 0xffffffff)) {
g_strlcpy(tempBuffer, "INFINITE", MAX_NTP_TIME_SIZE);
g_strlcpy(tempBuffer, "INFINITE", MAX_TIMESTAMP_SIZE);
} else if ((sec == 0) && (frac == 0)) {
g_strlcpy(tempBuffer, "0 sec", MAX_NTP_TIME_SIZE);
g_strlcpy(tempBuffer, "0 sec", MAX_TIMESTAMP_SIZE);
} else {
absolute = (gdouble)sec + (gdouble)frac / ((gdouble)(0x80000000) * 2.0);
g_snprintf(tempBuffer, MAX_NTP_TIME_SIZE,
g_snprintf(tempBuffer, MAX_TIMESTAMP_SIZE,
"%f sec (%ds + 0x%08x)", absolute, sec, frac);
}
time_tree = proto_tree_add_subtree_format(tree, tvb, offset, 8,
ett_rtps_ntp_time, NULL, "%s: %s", "lease_duration", tempBuffer);
ett_rtps_timestamp, NULL, "%s: %s", "lease_duration", tempBuffer);
proto_tree_add_item(time_tree, hf_rtps_param_ntpt_sec, tvb, offset, 4, encoding);
proto_tree_add_item(time_tree, hf_rtps_param_ntpt_fraction, tvb, offset+4, 4, encoding);
proto_tree_add_item(time_tree, hf_rtps_param_timestamp_sec, tvb, offset, 4, encoding);
proto_tree_add_item(time_tree, hf_rtps_param_timestamp_fraction, tvb, offset+4, 4, encoding);
}
}
@ -2276,7 +2281,7 @@ void rtps_util_add_durability_service_qos(proto_tree *tree,
subtree = proto_tree_add_subtree(tree, tvb, offset, 28, ett_rtps_durability_service, NULL, "PID_DURABILITY_SERVICE");
rtps_util_add_ntp_time_sec_and_fraction(subtree, tvb, offset, encoding, hf_rtps_durability_service_cleanup_delay);
rtps_util_add_timestamp_sec_and_fraction(subtree, tvb, offset, encoding, hf_rtps_durability_service_cleanup_delay);
proto_tree_add_item(subtree, hf_rtps_durability_service_history_kind, tvb, offset+8, 4, encoding);
proto_tree_add_item(subtree, hf_rtps_durability_service_history_depth, tvb, offset+12, 4, encoding);
proto_tree_add_item(subtree, hf_rtps_durability_service_max_samples, tvb, offset+16, 4, encoding);
@ -2295,7 +2300,7 @@ void rtps_util_add_liveliness_qos(proto_tree *tree, tvbuff_t *tvb, gint offset,
subtree = proto_tree_add_subtree(tree, tvb, offset, 12, ett_rtps_liveliness, NULL, "PID_LIVELINESS");
proto_tree_add_item(subtree, hf_rtps_liveliness_kind, tvb, offset, 4, encoding);
rtps_util_add_ntp_time_sec_and_fraction(subtree, tvb, offset+4, encoding, hf_rtps_liveliness_lease_duration);
rtps_util_add_timestamp_sec_and_fraction(subtree, tvb, offset+4, encoding, hf_rtps_liveliness_lease_duration);
}
/* ------------------------------------------------------------------------- */
@ -4113,7 +4118,7 @@ static gboolean dissect_parameter_sequence_rti(proto_tree *rtps_parameter_tree,
case PID_REACHABILITY_LEASE_DURATION:
ENSURE_LENGTH(8);
rtps_util_add_ntp_time_sec_and_fraction(rtps_parameter_tree, tvb, offset, encoding,
rtps_util_add_timestamp_sec_and_fraction(rtps_parameter_tree, tvb, offset, encoding,
hf_rtps_participant_lease_duration);
break;
/* 0...2...........7...............15.............23...............31
@ -4628,7 +4633,7 @@ static gboolean dissect_parameter_sequence_v1(proto_tree *rtps_parameter_tree, p
*/
case PID_PARTICIPANT_LEASE_DURATION:
ENSURE_LENGTH(8);
rtps_util_add_ntp_time_sec_and_fraction(rtps_parameter_tree, tvb, offset, encoding,
rtps_util_add_timestamp_sec_and_fraction(rtps_parameter_tree, tvb, offset, encoding,
hf_rtps_participant_lease_duration);
break;
@ -4644,7 +4649,7 @@ static gboolean dissect_parameter_sequence_v1(proto_tree *rtps_parameter_tree, p
*/
case PID_TIME_BASED_FILTER:
ENSURE_LENGTH(8);
rtps_util_add_ntp_time_sec_and_fraction(rtps_parameter_tree, tvb, offset, encoding,
rtps_util_add_timestamp_sec_and_fraction(rtps_parameter_tree, tvb, offset, encoding,
hf_rtps_time_based_filter_minimum_separation);
break;
@ -4788,7 +4793,7 @@ static gboolean dissect_parameter_sequence_v1(proto_tree *rtps_parameter_tree, p
* 'maxBlockingTime'.
*/
if (size == 12) {
rtps_util_add_ntp_time(rtps_parameter_tree, tvb, offset + 4,
rtps_util_add_timestamp(rtps_parameter_tree, tvb, offset + 4,
encoding, hf_rtps_reliability_max_blocking_time);
}
break;
@ -4890,7 +4895,7 @@ static gboolean dissect_parameter_sequence_v1(proto_tree *rtps_parameter_tree, p
case PID_DEADLINE_OFFERED: /* Deprecated */
case PID_DEADLINE:
ENSURE_LENGTH(8);
rtps_util_add_ntp_time_sec_and_fraction(rtps_parameter_tree, tvb, offset, encoding, hf_rtps_deadline_period);
rtps_util_add_timestamp_sec_and_fraction(rtps_parameter_tree, tvb, offset, encoding, hf_rtps_deadline_period);
break;
/* 0...2...........7...............15.............23...............31
@ -4918,7 +4923,7 @@ static gboolean dissect_parameter_sequence_v1(proto_tree *rtps_parameter_tree, p
case PID_LATENCY_BUDGET_OFFERED:
case PID_LATENCY_BUDGET:
ENSURE_LENGTH(8);
rtps_util_add_ntp_time_sec_and_fraction(rtps_parameter_tree, tvb, offset,
rtps_util_add_timestamp_sec_and_fraction(rtps_parameter_tree, tvb, offset,
encoding, hf_rtps_latency_budget_duration);
break;
@ -4954,7 +4959,7 @@ static gboolean dissect_parameter_sequence_v1(proto_tree *rtps_parameter_tree, p
*/
case PID_LIFESPAN:
ENSURE_LENGTH(8);
rtps_util_add_ntp_time_sec_and_fraction(rtps_parameter_tree, tvb, offset, encoding,
rtps_util_add_timestamp_sec_and_fraction(rtps_parameter_tree, tvb, offset, encoding,
hf_rtps_lifespan_duration);
break;
@ -5480,7 +5485,7 @@ static gboolean dissect_parameter_sequence_v1(proto_tree *rtps_parameter_tree, p
case PID_PERSISTENCE:
ENSURE_LENGTH(8);
rtps_util_add_ntp_time_sec_and_fraction(rtps_parameter_tree, tvb, offset, encoding,
rtps_util_add_timestamp_sec_and_fraction(rtps_parameter_tree, tvb, offset, encoding,
hf_rtps_persistence);
break;
@ -8477,7 +8482,7 @@ static void dissect_RTPS_DATA_BATCH(tvbuff_t *tvb, packet_info *pinfo, gint offs
/* Timestamp [only if T==1] */
if ((flags2 & FLAG_SAMPLE_INFO_T) != 0) {
rtps_util_add_ntp_time(si_tree, tvb, offset, encoding, hf_rtps_data_batch_timestamp);
rtps_util_add_timestamp(si_tree, tvb, offset, encoding, hf_rtps_data_batch_timestamp);
offset += 8;
}
@ -8675,7 +8680,7 @@ void dissect_INFO_TS(tvbuff_t *tvb, packet_info *pinfo, gint offset, guint8 flag
offset += 4;
if ((flags & FLAG_INFO_TS_T) == 0) {
rtps_util_add_ntp_time(tree,
rtps_util_add_timestamp(tree,
tvb,
offset,
encoding,
@ -10153,61 +10158,61 @@ void proto_register_rtps(void) {
{ &hf_rtps_durability_service_cleanup_delay,
{ "Service Cleanup Delay", "rtps.durability.service_cleanup_delay",
FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0,
"Time using the NTP standard format", HFILL }
"Time using the RTPS time_t standard format", HFILL }
},
{ &hf_rtps_liveliness_lease_duration,
{ "Lease Duration", "rtps.liveliness.lease_duration",
FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0,
"Time using the NTP standard format", HFILL }
"Time using the RTPS time_t standard format", HFILL }
},
{ &hf_rtps_participant_lease_duration,
{ "Duration", "rtps.participant_lease_duration",
FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0,
"Time using the NTP standard format", HFILL }
"Time using the RTPS time_t standard format", HFILL }
},
{ &hf_rtps_time_based_filter_minimum_separation,
{ "Minimum Separation", "rtps.time_based_filter.minimum_separation",
FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0,
"Time using the NTP standard format", HFILL }
"Time using the RTPS time_t standard format", HFILL }
},
{ &hf_rtps_reliability_max_blocking_time,
{ "Max Blocking Time", "rtps.reliability.max_blocking_time",
FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0,
"Time using the NTP standard format", HFILL }
"Time using the RTPS time_t standard format", HFILL }
},
{ &hf_rtps_deadline_period,
{ "Period", "rtps.deadline_period",
FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0,
"Time using the NTP standard format", HFILL }
"Time using the RTPS time_t standard format", HFILL }
},
{ &hf_rtps_latency_budget_duration,
{ "Duration", "rtps.latency_budget.duration",
FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0,
"Time using the NTP standard format", HFILL }
"Time using the RTPS time_t standard format", HFILL }
},
{ &hf_rtps_lifespan_duration,
{ "Duration", "rtps.lifespan",
FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0,
"Time using the NTP standard format", HFILL }
"Time using the RTPS time_t standard format", HFILL }
},
{ &hf_rtps_persistence,
{ "Persistence", "rtps.persistence",
FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0,
"Time using the NTP standard format", HFILL }
"Time using the RTPS time_t standard format", HFILL }
},
{ &hf_rtps_info_ts_timestamp,
{ "Timestamp", "rtps.info_ts.timestamp",
FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0,
"Time using the NTP standard format", HFILL }
"Time using the RTPS time_t standard format", HFILL }
},
{ &hf_rtps_locator_kind,
@ -10511,17 +10516,17 @@ void proto_register_rtps(void) {
},
/* Parameter / NtpTime ------------------------------------------------- */
{ &hf_rtps_param_ntpt_sec, {
{ &hf_rtps_param_timestamp_sec, {
"seconds", "rtps.param.ntpTime.sec",
FT_INT32, BASE_DEC, NULL, 0,
"The 'second' component of a NTP time",
"The 'second' component of an RTPS time_t",
HFILL }
},
{ &hf_rtps_param_ntpt_fraction, {
{ &hf_rtps_param_timestamp_fraction, {
"fraction", "rtps.param.ntpTime.fraction",
FT_UINT32, BASE_DEC, NULL, 0,
"The 'fraction' component of a NTP time",
"The 'fraction' component of an RTPS time_t",
HFILL }
},
@ -10751,7 +10756,7 @@ void proto_register_rtps(void) {
{ &hf_rtps_data_batch_timestamp,
{ "Timestamp", "rtps.data_batch.timestamp",
FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0,
"Time using the NTP standard format", HFILL }
"Time using the RTPS time_t standard format", HFILL }
},
{ &hf_rtps_data_batch_offset_to_last_sample_sn,
@ -11607,7 +11612,7 @@ void proto_register_rtps(void) {
&ett_rtps_locator_udp_v4,
&ett_rtps_locator,
&ett_rtps_locator_list,
&ett_rtps_ntp_time,
&ett_rtps_timestamp,
&ett_rtps_bitmap,
&ett_rtps_seq_string,
&ett_rtps_seq_ulong,

View File

@ -1803,16 +1803,14 @@ get_time_value(tvbuff_t *tvb, const gint start, const gint length, const guint e
time_stamp->nsecs = (int)((todsecs % 1000000) * 1000);
break;
case ENC_TIME_NTP_BASE_ZERO|ENC_BIG_ENDIAN:
case ENC_TIME_RTPS|ENC_BIG_ENDIAN:
/*
* DDS NTP time stamp, big-endian.
* Time stamp using the same seconds/fraction format
* as NTP, but with the origin of the time stamp being
* the UNIX epoch rather than the NTP epoch; big-
* endian.
*/
#define NTP_BASETIME_ZERO G_GUINT64_CONSTANT(0)
tmpsecs = tvb_get_ntohl(tvb, start);
time_stamp->secs = (time_t)(tmpsecs - (guint32)NTP_BASETIME_ZERO);
time_stamp->secs = (time_t)tvb_get_ntohl(tvb, start);
if (length == 8) {
/*
* We're using nanoseconds here (and we will
@ -1827,9 +1825,12 @@ get_time_value(tvbuff_t *tvb, const gint start, const gint length, const guint e
}
break;
case ENC_TIME_NTP_BASE_ZERO|ENC_LITTLE_ENDIAN:
case ENC_TIME_RTPS|ENC_LITTLE_ENDIAN:
/*
* NTP time stamp, big-endian.
* Time stamp using the same seconds/fraction format
* as NTP, but with the origin of the time stamp being
* the UNIX epoch rather than the NTP epoch; little-
* endian.
*/
time_stamp->secs = (time_t)tvb_get_letohl(tvb, start);
if (length == 8) {

View File

@ -386,21 +386,24 @@ WS_DLL_PUBLIC WS_NORETURN void proto_report_dissector_bug(const char *message);
* ENC_TIME_TOD - 8 bytes, as a count of microseconds since the System/3x0
* and z/Architecture epoch (1900-01-01 00:00:00 GMT).
*
* ENC_TIME_NTP_BASE_ZERO - 4 or 8 bytes; the first 4 bytes are seconds
* since the UN*X epoch, and, if there are 8 bytes, the next 4 bytes are
* are 1/2^32's of a second since that second. (I.e., it's the offspring
* of a mating between UN*X time and NTP time.)
* ENC_TIME_RTPS - 4 or 8 bytes; the first 4 bytes are seconds since the
* UN*X epoch, and, if there are 8 bytes, the next 4 bytes are are
* 1/2^32's of a second since that second. (I.e., it's the offspring
* of a mating between UN*X time and NTP time.) It's used by the Object
* Management Group's Real-Time Publish-Subscribe Wire Protocol for the
* Data Distribution Service.
*
* ENC_TIME_TIMEVAL - 8 bytes; the first 4 bytes are seconds since
* the UN*X epoch (1970-01-01 00:00:00 UTC), and, if there are 8 bytes,
* the next 4 bytes are microseconds since that second. (I.e., a UN*X
* struct timeval with a 4-byte time_t.)
*/
#define ENC_TIME_TIMESPEC 0x00000000
#define ENC_TIME_NTP 0x00000002
#define ENC_TIME_TOD 0x00000004
#define ENC_TIME_NTP_BASE_ZERO 0x00000008
#define ENC_TIME_TIMEVAL 0x00000010
#define ENC_TIME_TIMESPEC 0x00000000
#define ENC_TIME_NTP 0x00000002
#define ENC_TIME_TOD 0x00000004
#define ENC_TIME_RTPS 0x00000008
#define ENC_TIME_NTP_BASE_ZERO ENC_TIME_RTP /* for backwards source compatibility */
#define ENC_TIME_TIMEVAL 0x00000010
/*
* Historically, the only place the representation mattered for strings