On Thu, Nov 30, 2023 at 04:32:20PM +0100, Andrew Zaborowski wrote:
> > @@ -249,6 +250,9 @@ struct config_item config_tab[] = {
> > GLOB_ITEM_INT("clock_class_threshold",
> > CLOCK_CLASS_THRESHOLD_DEFAULT, 6, CLOCK_CLASS_THRESHOLD_DEFAULT),
> > GLOB_ITEM_ENU("clock_servo", CLOCK_SERVO_PI, clock_servo_enu),
> > GLOB_ITEM_ENU("clock_type", CLOCK_TYPE_ORDINARY, clock_type_enu),
> > + PORT_ITEM_STR("cmlds_client_address", "/var/run/cmlds_cleint"),
>
> I assume the use of this is simply to set unique names for per-port
> sockets. Maybe something like tempnam() could be used instead.
No, it has to be under user control, because the path might be under a
security policy.
> > @@ -1868,6 +1869,33 @@ static void port_clear_fda(struct port *p, int count)
> > p->fda.fd[i] = -1;
> > }
> >
> > +static int port_cmlds_initialize(struct port *p)
> > +{
> > + struct config *cfg = clock_config(p->clock);
> > + struct subscribe_events_np sen = {0};
> > + const int zero_datalen = 1;
> > + const UInteger8 hops = 0;
> > +
> > + p->cmlds_port = config_get_int(cfg, p->name, "cmlds_port");
>
> Should this fall back to port_number(p)?
I don't see how, since there is always a default for each
configuration option. Also, I understood from you guys that the port
number _has_ to be different to pass compliance tests. For that, I
thought adding a "starting port number" option would do the trick.
> > + p->cmlds_pmc = pmc_create(cfg, TRANS_UDS,
> > + config_get_string(cfg, p->name,
> > "cmlds_client_address"),
> > + config_get_string(cfg, p->name,
> > "cmlds_server_address"),
> > + hops,
> > + config_get_int(cfg, NULL, "domainNumber"),
> > + config_get_int(cfg, p->name,
> > "transportSpecific") << 4,
>
> The sdoId is (by either IEEE 1588 or 802.1AS) different for the CMLDS
> than for a P2P_COMMON port, I think a check in port_ignore will
> discard the messages as a result. Maybe hardcode TS_CMLDS here? (with
> TS_CMLDS defined in msg.h next to TS_IEEE_8021AS)
>
> Using pmc here surely works but I wonder if it's not actually more
> work than reusing c->uds_port.
I considered that, but I invite you to try implementing that to see
which one is simpler.
> > + switch (mgt->id) {
> > + case MID_CMLDS_INFO_NP:
> > + if (msg->header.sourcePortIdentity.portNumber !=
> > p->cmlds_port) {
> > + break;
> > + }
> > + cmlds = (struct cmlds_info_np *) mgt->data;
> > + p->peer_delay = nanoseconds_to_tmv(cmlds->meanLinkDelay >>
> > 16);
> > + p->peerMeanPathDelay = tmv_to_TimeInterval(p->peer_delay);
>
> cmlds->meanLinkDelay is already a TimeInterval in case you want to use that.
good point
> > +
> > + if (p->state == PS_UNCALIBRATED || p->state == PS_SLAVE) {
> > + const struct timestamp dummy = {0};
> > + const tmv_t tx = timestamp_to_tmv(dummy);
>
> tmv_zero() could also be used.
yeah
> > + clock_peer_delay(p->clock, p->peer_delay, tx, tx,
> > + p->nrate.ratio);
>
> p->nrate.ratio hasn't been set yet, I think a line similar to this is missing:
>
> p->nrate.ratio = 1.0 + (double) cmlds->scaledNeighborRateRatio / POW2_41;
Right
> The CMLDS port will also need to ensure that the NRR is calculated
> because now it's done conditionally.
Huh, I didn't change that part?
> In Kishen's patch series struct cmlds_info_np also had a
> .serviceMeasurementValid which enabled the port_capable() logic to
> work and IIRC that is important at least for 802.1AS compliance. If
> that was to be re-added, the event would need to be emitted in an
> extra place in the CMLDS, perhaps where pdr_missing is incremented.
serviceMeasurementValid is implicit, because if you get a PUSH
notification, it is valid.
Thanks,
Richard
_______________________________________________
Linuxptp-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel