Re: [Linuxptp-devel] [RFC PATCH v2 1/9] Add new TLV for CommonMeanLinkDelayInformation
PTP IEEE 1588 stack for Linux
Brought to you by:
rcochran
|
From: Kishen M. <kis...@in...> - 2023-05-16 21:43:23
|
On 5/16/23 3:56 AM, Erez wrote:
> On Tue, 16 May 2023 at 00:29, Kishen Maloor <kis...@in...> wrote:
>
>> In a setup with multiple gPTP domains, the Common Mean Link Delay Service
>> (CMLDS) (IEEE 1588/16.6.3) performs link delay measurements in a single
>> domain and must (somehow) convey those to other domains. IEEE 1588 does not
>> specify this interface and flags it as an implementation
>> detail (IEEE 1588/16.6.1). Accordningly, this change introduces a new
>> TLV to convey link delay measurements by the CMLDS over the management
>> interface.
>>
>> In addition to the parameters suggested in IEEE 1588/16.6.3.2,
>> the TLV also conveys the latest 'up measurements' (req and rx timestamps)
>> recorded in the CMLDS. These values collectively aid other gPTP domains to
>> complete their delay/offset computations via the COMMON_P2P
>> delay mechanism.
>>
>> Updated 'pmc' to support the new MID, MID_CMLDS_INFO_NP.
>>
>> Co-authored-by: Andrew Zaborowski <and...@in...>
>> Signed-off-by: Kishen Maloor <kis...@in...>
>> ---
>> clock.c | 1 -
>> msg.h | 2 ++
>> pmc.c | 13 +++++++++++++
>> pmc_common.c | 1 +
>> port.c | 22 ++++++++++++++++++++++
>> port_private.h | 2 ++
>> tlv.c | 18 ++++++++++++++++++
>> tlv.h | 11 +++++++++++
>> 8 files changed, 69 insertions(+), 1 deletion(-)
>>
>> diff --git a/clock.c b/clock.c
>> index fe08d48ed8f8..c74a6baa9f61 100644
>> --- a/clock.c
>> +++ b/clock.c
>> @@ -47,7 +47,6 @@
>> #include "util.h"
>>
>> #define N_CLOCK_PFD (N_POLLFD + 1) /* one extra per port, for the fault
>> timer */
>> -#define POW2_41 ((double)(1ULL << 41))
>>
>> struct interface {
>> STAILQ_ENTRY(interface) list;
>> diff --git a/msg.h b/msg.h
>> index cbd09e75a2aa..db12e249f89f 100644
>> --- a/msg.h
>> +++ b/msg.h
>> @@ -69,6 +69,8 @@
>> #define SIGNAL_NO_CHANGE -128
>> #define SIGNAL_SET_INITIAL 126
>>
>> +#define POW2_41 ((double)(1ULL << 41))
>> +
>> enum timestamp_type {
>> TS_SOFTWARE,
>> TS_HARDWARE,
>> diff --git a/pmc.c b/pmc.c
>> index 00e691f0c244..cac06fb5b41d 100644
>> --- a/pmc.c
>> +++ b/pmc.c
>> @@ -169,6 +169,7 @@ static void pmc_show(struct ptp_message *msg, FILE *fp)
>> struct subscribe_events_np *sen;
>> struct port_properties_np *ppn;
>> struct port_hwclock_np *phn;
>> + struct cmlds_info_np *cmlds;
>> struct timePropertiesDS *tp;
>> struct management_tlv *mgt;
>> struct time_status_np *tsn;
>> @@ -651,6 +652,18 @@ static void pmc_show(struct ptp_message *msg, FILE
>> *fp)
>> fprintf(fp, "LOG_MIN_PDELAY_REQ_INTERVAL "
>> IFMT "logMinPdelayReqInterval %hhd", mtd->val);
>> break;
>> + case MID_CMLDS_INFO_NP:
>> + cmlds = (struct cmlds_info_np *) mgt->data;
>> + fprintf(fp, "CMLDS INFO "
>> + IFMT "serviceMeasurementValid %i"
>> + IFMT "meanLinkDelay %" PRId64
>> + IFMT "scaledNeighborRateRatio %" PRId32
>> + IFMT "egress_ts %" PRId64
>> + IFMT "rx_ts %" PRId64,
>> + cmlds->serviceMeasurementValid,
>> cmlds->meanLinkDelay,
>> + cmlds->scaledNeighborRateRatio,
>> + cmlds->egress_ts, cmlds->rx_ts);
>> + break;
>> }
>> out:
>> fprintf(fp, "\n");
>> diff --git a/pmc_common.c b/pmc_common.c
>> index 9e251c43e95b..d7a6114dcd62 100644
>> --- a/pmc_common.c
>> +++ b/pmc_common.c
>> @@ -156,6 +156,7 @@ struct management_id idtab[] = {
>> { "UNICAST_MASTER_TABLE_NP", MID_UNICAST_MASTER_TABLE_NP,
>> do_get_action },
>> { "PORT_HWCLOCK_NP", MID_PORT_HWCLOCK_NP, do_get_action },
>> { "POWER_PROFILE_SETTINGS_NP", MID_POWER_PROFILE_SETTINGS_NP,
>> do_set_action },
>> + { "CMLDS_INFO_NP", MID_CMLDS_INFO_NP, do_get_action },
>> };
>>
>> static void do_get_action(struct pmc *pmc, int action, int index, char
>> *str)
>> diff --git a/port.c b/port.c
>> index 8b2eb04a855a..d467a69e519a 100644
>> --- a/port.c
>> +++ b/port.c
>> @@ -887,6 +887,7 @@ static int port_management_fill_response(struct port
>> *target,
>> struct clock_description *desc;
>> struct port_properties_np *ppn;
>> struct port_hwclock_np *phn;
>> + struct cmlds_info_np *cmlds;
>> struct management_tlv *tlv;
>> struct port_stats_np *psn;
>> struct foreign_clock *fc;
>> @@ -1129,6 +1130,27 @@ static int port_management_fill_response(struct
>> port *target,
>> memcpy(pwr, &target->pwr, sizeof(*pwr));
>> datalen = sizeof(*pwr);
>> break;
>> + case MID_CMLDS_INFO_NP:
>> + cmlds = (struct cmlds_info_np *)tlv->data;
>> + /* IEEE1588-2019 16.6.3.2 h) 1) && nrate.ratio_valid
>> because
>> + * we have no extra field to convey that separately.
>> + */
>> + cmlds->serviceMeasurementValid =
>> + target->peer_portid_valid && !target->pdr_missing
>> &&
>> + !target->multiple_pdr_detected &&
>> + target->nrate.ratio_valid;
>> + cmlds->meanLinkDelay = target->peerMeanPathDelay;
>> + cmlds->scaledNeighborRateRatio =
>> + (Integer32) (target->nrate.ratio * POW2_41 -
>> POW2_41);
>> + /* 16.6.3.2: "Upon receipt of a request for information,
>> the
>> + * Common Mean Link Delay Service may in addition return
>> the
>> + * raw measurement data gathered by the service for use in
>> + * estimating the <meanLinkDelay> and <neighborRateRatio>."
>> + */
>> + cmlds->egress_ts =
>> tmv_to_nanoseconds(target->peer_delay_t1);
>> + cmlds->rx_ts = tmv_to_nanoseconds(target->peer_delay_t2);
>> + datalen = sizeof(*cmlds);
>> + break;
>> default:
>> /* The caller should *not* respond to this message. */
>> tlv_extra_recycle(extra);
>> diff --git a/port_private.h b/port_private.h
>> index 3b02d2fe45c4..c9b02bc799f5 100644
>> --- a/port_private.h
>> +++ b/port_private.h
>> @@ -99,6 +99,8 @@ struct port {
>> unsigned int pdr_missing;
>> unsigned int multiple_seq_pdr_count;
>> unsigned int multiple_pdr_detected;
>> + tmv_t peer_delay_t1;
>> + tmv_t peer_delay_t2;
>> enum port_state (*state_machine)(enum port_state state,
>> enum fsm_event event, int mdiff);
>> int bmca;
>> diff --git a/tlv.c b/tlv.c
>> index 79400126cbc4..8b97d2cfc9f5 100644
>> --- a/tlv.c
>> +++ b/tlv.c
>> @@ -176,6 +176,7 @@ static int mgt_post_recv(struct management_tlv *m,
>> uint16_t data_len,
>> struct port_properties_np *ppn;
>> struct port_hwclock_np *phn;
>> struct timePropertiesDS *tp;
>> + struct cmlds_info_np *cmlds;
>> struct time_status_np *tsn;
>> struct port_stats_np *psn;
>> int extra_len = 0, i, len;
>> @@ -490,6 +491,15 @@ static int mgt_post_recv(struct management_tlv *m,
>> uint16_t data_len,
>> if (data_len != 0)
>> goto bad_length;
>> break;
>> + case MID_CMLDS_INFO_NP:
>> + if (data_len < sizeof(struct cmlds_info_np))
>> + goto bad_length;
>> + cmlds = (struct cmlds_info_np *)m->data;
>> + net2host64_unaligned(&cmlds->meanLinkDelay);
>> + NTOHL(cmlds->scaledNeighborRateRatio);
>> + net2host64_unaligned(&cmlds->egress_ts);
>> + net2host64_unaligned(&cmlds->rx_ts);
>> + break;
>> }
>> if (extra_len) {
>> if (extra_len % 2)
>> @@ -514,6 +524,7 @@ static void mgt_pre_send(struct management_tlv *m,
>> struct tlv_extra *extra)
>> struct subscribe_events_np *sen;
>> struct port_properties_np *ppn;
>> struct port_hwclock_np *phn;
>> + struct cmlds_info_np *cmlds;
>> struct timePropertiesDS *tp;
>> struct time_status_np *tsn;
>> struct port_stats_np *psn;
>> @@ -672,6 +683,13 @@ static void mgt_pre_send(struct management_tlv *m,
>> struct tlv_extra *extra)
>> HTONL(pwr->networkTimeInaccuracy);
>> HTONL(pwr->totalTimeInaccuracy);
>> break;
>> + case MID_CMLDS_INFO_NP:
>> + cmlds = (struct cmlds_info_np *)m->data;
>> + host2net64_unaligned(&cmlds->meanLinkDelay);
>> + HTONL(cmlds->scaledNeighborRateRatio);
>> + host2net64_unaligned(&cmlds->egress_ts);
>> + host2net64_unaligned(&cmlds->rx_ts);
>> + break;
>> }
>> }
>>
>> diff --git a/tlv.h b/tlv.h
>> index 8b51ffd88816..6446fc068488 100644
>> --- a/tlv.h
>> +++ b/tlv.h
>> @@ -130,6 +130,9 @@ enum management_action {
>> #define MID_PORT_HWCLOCK_NP 0xC009
>> #define MID_POWER_PROFILE_SETTINGS_NP 0xC00A
>>
>> +/* CMLDS management ID values */
>> +#define MID_CMLDS_INFO_NP 0xC00B
>> +
>> /* Management error ID values */
>> #define MID_RESPONSE_TOO_BIG 0x0001
>> #define MID_NO_SUCH_ID 0x0002
>> @@ -473,6 +476,14 @@ struct msg_interface_rate_tlv {
>> UInteger16 numberOfBitsAfterTimestamp;
>> } PACKED;
>>
>> +struct cmlds_info_np {
>> + Integer8 serviceMeasurementValid;
>> + TimeInterval meanLinkDelay;
>> + Integer32 scaledNeighborRateRatio;
>
> + Integer64 egress_ts;
>> + Integer64 rx_ts;
>>
>
> Not really sure what is better.
> But why not using Timestamp?, the annoying type from IEEE.
> Can you please add a remark here with cons and pros and a decision here?
This TLV (and its conveyance method) is unspecified and is set by the implementation.
So as such, we're handing these tmv_t timestamps as is to a requesting port, wherefrom
they're directly passed in a call to clock_peer_delay().
I guess we didn't think to send these values as struct Timestamp instead because it wasn't
necessary.
>
>
>> +} PACKED;
>> +
>> /**
>> * Allocates a new tlv_extra structure.
>> * @return Pointer to a new structure on success or NULL otherwise.
>> --
>> 2.31.1
>>
>>
>>
>> _______________________________________________
>> Linuxptp-devel mailing list
>> Lin...@li...
>> https://lists.sourceforge.net/lists/listinfo/linuxptp-devel
>>
>
|