Slave Event Monitoring channel for the alternate connections Signed-off-by: Greg Armstrong <greg.armstrong...@renesas.com> Signed-off-by: Leon Goldin <leon.goldin...@renesas.com> Signed-off-by: Devasish Dey <devasish....@syncmonk.net> Signed-off-by: Vipin Sharma <vipin.sha...@syncmonk.net> --- monitor.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ monitor.h | 3 +++ pmc.c | 31 +++++++++++++++++++++++++++ tlv.h | 21 +++++++++++++++++++ 4 files changed, 118 insertions(+)
diff --git a/monitor.c b/monitor.c index ed451ac..1965a89 100644 --- a/monitor.c +++ b/monitor.c @@ -21,8 +21,10 @@ struct monitor_message { struct monitor { struct port *dst_port; struct slave_rx_sync_timing_data_tlv *sync_tlv; + struct slave_rx_sync_computed_data_tlv *computed_tlv; struct slave_delay_timing_data_tlv *delay_tlv; struct monitor_message delay; + struct monitor_message computed; struct monitor_message sync; }; @@ -115,6 +117,23 @@ static int monitor_init_sync(struct monitor *monitor, struct address address) return 0; } +static int monitor_init_computed(struct monitor *monitor, struct address address) +{ + const size_t tlv_size = sizeof(struct slave_rx_sync_computed_data_tlv) + + sizeof(struct slave_rx_sync_computed_record) * RECORDS_PER_MESSAGE; + struct tlv_extra *extra; + + extra = monitor_init_message(&monitor->computed, monitor->dst_port, + TLV_SLAVE_RX_SYNC_COMPUTED_DATA, tlv_size, + address); + if (!extra) { + return -1; + } + monitor->computed_tlv = (struct slave_rx_sync_computed_data_tlv *) extra->tlv; + + return 0; +} + struct monitor *monitor_create(struct config *config, struct port *dst) { struct monitor *monitor; @@ -148,6 +167,12 @@ struct monitor *monitor_create(struct config *config, struct port *dst) free(monitor); return NULL; } + if (monitor_init_computed(monitor, address)) { + msg_put(monitor->sync.msg); + msg_put(monitor->delay.msg); + free(monitor); + return NULL; + } return monitor; } @@ -193,6 +218,9 @@ void monitor_destroy(struct monitor *monitor) if (monitor->sync.msg) { msg_put(monitor->sync.msg); } + if (monitor->computed.msg) { + msg_put(monitor->computed.msg); + } free(monitor); } @@ -229,3 +257,38 @@ int monitor_sync(struct monitor *monitor, struct PortIdentity source_pid, } return 0; } + +int monitor_computed(struct monitor *monitor, struct PortIdentity source_pid, + uint16_t seqid, tmv_t offset, tmv_t pathdelay, int32_t ratio, + uint8_t best_master) +{ + struct slave_rx_sync_computed_record *record; + struct ptp_message *msg; + + if (!monitor_active(monitor)) { + return 0; + } + + msg = monitor->computed.msg; + + if (!pid_eq(&monitor->computed_tlv->sourcePortIdentity, &source_pid)) { + /* There was a change in remote master. Drop stale records. */ + memcpy(&monitor->computed_tlv->sourcePortIdentity, &source_pid, + sizeof(monitor->computed_tlv->sourcePortIdentity)); + monitor->computed.count = 0; + } + + record = monitor->computed_tlv->record + monitor->computed.count; + monitor->computed_tlv->reserved = 0; + record->sequenceId = seqid; + record->offsetFromMaster = tmv_to_TimeInterval(offset); + record->meanPathDelay = tmv_to_TimeInterval(pathdelay); + record->scaledNeighborRateRatio = ratio; + + monitor->computed.count++; + if (monitor->computed.count == monitor->computed.records_per_msg) { + monitor->computed.count = 0; + return monitor_forward(monitor->dst_port, msg); + } + return 0; +} diff --git a/monitor.h b/monitor.h index c489aa9..9beb57e 100644 --- a/monitor.h +++ b/monitor.h @@ -22,4 +22,7 @@ void monitor_destroy(struct monitor *monitor); int monitor_sync(struct monitor *monitor, struct PortIdentity source_pid, uint16_t seqid, tmv_t t1, tmv_t corr, tmv_t t2); +int monitor_computed(struct monitor *monitor, struct PortIdentity source_pid, + uint16_t seqid, tmv_t offset, tmv_t pathdelay, int32_t ratio, + uint8_t best_master); #endif diff --git a/pmc.c b/pmc.c index e218ca4..b6227dd 100644 --- a/pmc.c +++ b/pmc.c @@ -88,6 +88,19 @@ static void pmc_show_rx_sync_timing(struct slave_rx_sync_timing_record *record, SHOW_TIMESTAMP(record->syncEventIngressTimestamp)); } +static void pmc_show_rx_sync_computed_data(struct slave_rx_sync_computed_record *record, + FILE *fp) +{ + fprintf(fp, + IFMT "sequenceId %hu" + IFMT "offsetFromMaster %" PRId64 + IFMT "meanPathDelay %" PRId64 + IFMT "scaledNeighborRateRatio %d", + record->sequenceId, + record->offsetFromMaster, + record->meanPathDelay, + record->scaledNeighborRateRatio); +} static void pmc_show_unicast_master_entry(struct unicast_master_entry *entry, FILE *fp) @@ -110,8 +123,10 @@ static void pmc_show_signaling(struct ptp_message *msg, FILE *fp) { struct slave_rx_sync_timing_record *sync_record; struct slave_delay_timing_record *delay_record; + struct slave_rx_sync_computed_record *sync_computed_record; struct slave_rx_sync_timing_data_tlv *srstd; struct slave_delay_timing_data_tlv *sdtdt; + struct slave_rx_sync_computed_data_tlv *srscdt; struct tlv_extra *extra; int i, cnt; @@ -147,6 +162,22 @@ static void pmc_show_signaling(struct ptp_message *msg, FILE *fp) delay_record++; } break; + case TLV_SLAVE_RX_SYNC_COMPUTED_DATA: + srscdt = (struct slave_rx_sync_computed_data_tlv *) extra->tlv; + cnt = (srscdt->length - sizeof(srscdt->sourcePortIdentity)) / + sizeof(*sync_computed_record); + fprintf(fp, "SLAVE_RX_SYNC_COMPUTED_DATA N %d " + IFMT "sourcePortIdentity %s" + IFMT "computedFlags %02x" + IFMT "reserved %02x", + cnt, pid2str(&srscdt->sourcePortIdentity), + srscdt->computedFlags, srscdt->reserved); + sync_computed_record = srscdt->record; + for (i = 0; i < cnt; i++) { + pmc_show_rx_sync_computed_data(sync_computed_record, fp); + sync_computed_record++; + } + break; default: break; } diff --git a/tlv.h b/tlv.h index 8966696..38a48c9 100644 --- a/tlv.h +++ b/tlv.h @@ -283,6 +283,27 @@ struct slave_rx_sync_timing_data_tlv { sizeof(struct slave_rx_sync_timing_data_tlv)) / \ sizeof(struct slave_rx_sync_timing_record)) +struct slave_rx_sync_computed_record { + UInteger16 sequenceId; + TimeInterval offsetFromMaster; + TimeInterval meanPathDelay; + Integer32 scaledNeighborRateRatio; +} PACKED; + +struct slave_rx_sync_computed_data_tlv { + Enumeration16 type; + UInteger16 length; + struct PortIdentity sourcePortIdentity; + uint8_t computedFlags; + uint8_t reserved; + struct slave_rx_sync_computed_record record[0]; +} PACKED; + +#define SLAVE_RX_SYNC_COMPUTED_MAX \ + ((sizeof(struct message_data) - sizeof(struct signaling_msg) - \ + sizeof(struct slave_rx_sync_computed_data_tlv)) / \ + sizeof(struct slave_rx_sync_computed_record)) + typedef struct Integer96 { uint16_t nanoseconds_msb; uint64_t nanoseconds_lsb; -- 2.25.1 _______________________________________________ Linuxptp-devel mailing list Linuxptp-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxptp-devel