static gint domain_stats_n_hooks;
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 */
static GstClockTime
log2_to_clock_time (gint l)
return;
}
- sender->announce_interval = log2_to_clock_time (msg->log_message_interval);
+ 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);
+ }
announce = g_new0 (PtpAnnounceMessage, 1);
announce->receive_time = receive_time;
return;
#endif
- domain->sync_interval = log2_to_clock_time (msg->log_message_interval);
+ 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);
+ }
/* Check if duplicated */
for (l = domain->pending_syncs.head; l; l = l->next) {
requesting_port_identity.port_number != ptp_clock_id.port_number)
return;
- domain->min_delay_req_interval =
- log2_to_clock_time (msg->log_message_interval);
+ 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 =
+ log2_to_clock_time (msg->log_message_interval);
+ }
/* Check if we know about this one */
for (l = domain->pending_syncs.head; l; l = l->next) {