mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-23 02:01:12 +00:00
ptp: Work around bug in ptpd in default configuration
ptpd is defaulting to the hybrid mode, and was sending invalid multicast PTP messages in that configuration until ce96c742a88792a8d92deebaf03927e1b367f4a9. While this commit was made in 2015 there was no release in the meantime. Work around this by detecting this case and defaulting to the default values for the given intervals as given by the PTP standard. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4654>
This commit is contained in:
parent
d55492add4
commit
639367f818
1 changed files with 39 additions and 4 deletions
|
@ -382,6 +382,11 @@ static GHookList domain_stats_hooks;
|
||||||
static gint domain_stats_n_hooks;
|
static gint domain_stats_n_hooks;
|
||||||
static gboolean domain_stats_hooks_initted = FALSE;
|
static gboolean domain_stats_hooks_initted = FALSE;
|
||||||
|
|
||||||
|
/* Only ever accessed from the PTP thread */
|
||||||
|
/* PTPD in hybrid mode (default) sends multicast PTP messages with an invalid
|
||||||
|
* logMessageInterval. We work around this here and warn once */
|
||||||
|
static gboolean ptpd_hybrid_workaround_warned_once = FALSE;
|
||||||
|
|
||||||
/* Converts log2 seconds to GstClockTime */
|
/* Converts log2 seconds to GstClockTime */
|
||||||
static GstClockTime
|
static GstClockTime
|
||||||
log2_to_clock_time (gint l)
|
log2_to_clock_time (gint l)
|
||||||
|
@ -945,7 +950,17 @@ handle_announce_message (PtpMessage * msg, GstClockTime receive_time)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (msg->log_message_interval == 0x7f) {
|
||||||
|
sender->announce_interval = 2 * GST_SECOND;
|
||||||
|
|
||||||
|
if (!ptpd_hybrid_workaround_warned_once) {
|
||||||
|
GST_WARNING ("Working around ptpd bug: ptpd sends multicast PTP packets "
|
||||||
|
"with invalid logMessageInterval");
|
||||||
|
ptpd_hybrid_workaround_warned_once = TRUE;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
sender->announce_interval = log2_to_clock_time (msg->log_message_interval);
|
sender->announce_interval = log2_to_clock_time (msg->log_message_interval);
|
||||||
|
}
|
||||||
|
|
||||||
announce = g_new0 (PtpAnnounceMessage, 1);
|
announce = g_new0 (PtpAnnounceMessage, 1);
|
||||||
announce->receive_time = receive_time;
|
announce->receive_time = receive_time;
|
||||||
|
@ -1519,7 +1534,17 @@ handle_sync_message (PtpMessage * msg, GstClockTime receive_time)
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (msg->log_message_interval == 0x7f) {
|
||||||
|
domain->sync_interval = GST_SECOND;
|
||||||
|
|
||||||
|
if (!ptpd_hybrid_workaround_warned_once) {
|
||||||
|
GST_WARNING ("Working around ptpd bug: ptpd sends multicast PTP packets "
|
||||||
|
"with invalid logMessageInterval");
|
||||||
|
ptpd_hybrid_workaround_warned_once = TRUE;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
domain->sync_interval = log2_to_clock_time (msg->log_message_interval);
|
domain->sync_interval = log2_to_clock_time (msg->log_message_interval);
|
||||||
|
}
|
||||||
|
|
||||||
/* Check if duplicated */
|
/* Check if duplicated */
|
||||||
for (l = domain->pending_syncs.head; l; l = l->next) {
|
for (l = domain->pending_syncs.head; l; l = l->next) {
|
||||||
|
@ -1716,8 +1741,18 @@ handle_delay_resp_message (PtpMessage * msg, GstClockTime receive_time)
|
||||||
requesting_port_identity.port_number != ptp_clock_id.port_number)
|
requesting_port_identity.port_number != ptp_clock_id.port_number)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (msg->log_message_interval == 0x7f) {
|
||||||
|
domain->min_delay_req_interval = GST_SECOND;
|
||||||
|
|
||||||
|
if (!ptpd_hybrid_workaround_warned_once) {
|
||||||
|
GST_WARNING ("Working around ptpd bug: ptpd sends multicast PTP packets "
|
||||||
|
"with invalid logMessageInterval");
|
||||||
|
ptpd_hybrid_workaround_warned_once = TRUE;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
domain->min_delay_req_interval =
|
domain->min_delay_req_interval =
|
||||||
log2_to_clock_time (msg->log_message_interval);
|
log2_to_clock_time (msg->log_message_interval);
|
||||||
|
}
|
||||||
|
|
||||||
/* Check if we know about this one */
|
/* Check if we know about this one */
|
||||||
for (l = domain->pending_syncs.head; l; l = l->next) {
|
for (l = domain->pending_syncs.head; l; l = l->next) {
|
||||||
|
|
Loading…
Reference in a new issue