This change adds COMMON_P2P (IEEE 802.1AS-2020, clause 14.8.5) to the
enumeration of delay mechanisms and incorporates it into existing code
paths pertaining to DM_P2P to (where appropriate) maintain parity with
DM_P2P.
Co-authored-by: Andrew Zaborowski
Signed-off-by: Kishen Maloor
---
config.c | 1 +
dm.h | 3 +++
port.c | 15 +--
unicast_client.c | 10 +++---
4 files changed, 20 insertions(+), 9 deletions(-)
diff --git a/config.c b/config.c
index 3e7587ba81ab..0482554feb28 100644
--- a/config.c
+++ b/config.c
@@ -173,6 +173,7 @@ static struct config_enum delay_mech_enu[] = {
{ "Auto", DM_AUTO },
{ "E2E", DM_E2E },
{ "P2P", DM_P2P },
+ { "COMMON_P2P", DM_COMMON_P2P },
{ "NONE", DM_NO_MECHANISM },
{ NULL, 0 },
};
diff --git a/dm.h b/dm.h
index 47bd8474ca0d..80d1ce551166 100644
--- a/dm.h
+++ b/dm.h
@@ -34,6 +34,9 @@ enum delay_mechanism {
/** Peer delay mechanism. */
DM_P2P,
+ /** Peer delay as measured by CMLDS. */
+ DM_COMMON_P2P,
+
/** No Delay Mechanism. */
DM_NO_MECHANISM = 0xFE,
};
diff --git a/port.c b/port.c
index 94ce037871f1..87780fd39caa 100644
--- a/port.c
+++ b/port.c
@@ -967,7 +967,8 @@ static int port_management_fill_response(struct port
*target,
ptp_text_copy(cd->userDescription, &desc->userDescription);
buf += sizeof(struct PTPText) + cd->userDescription->length;
- if (target->delayMechanism == DM_P2P) {
+ if (target->delayMechanism == DM_P2P ||
+ target->delayMechanism == DM_COMMON_P2P) {
memcpy(buf, profile_id_p2p, PROFILE_ID_LEN);
} else {
struct config *cfg = clock_config(target->clock);
@@ -1291,7 +1292,7 @@ int port_set_delay_tmo(struct port *p)
return 0;
}
- if (p->delayMechanism == DM_P2P) {
+ if (p->delayMechanism == DM_P2P || p->delayMechanism == DM_COMMON_P2P) {
return set_tmo_log(p->fda.fd[FD_DELAY_TIMER], 1,
p->logPdelayReqInterval);
} else {
@@ -2128,7 +2129,7 @@ static int process_delay_req(struct port *p, struct
ptp_message *m)
return 0;
}
- if (p->delayMechanism == DM_P2P) {
+ if (p->delayMechanism == DM_P2P || p->delayMechanism == DM_COMMON_P2P) {
pr_warning("%s: delay request on P2P port", p->log_name);
return 0;
}
@@ -2293,8 +2294,9 @@ int process_pdelay_req(struct port *p, struct ptp_message
*m)
return -1;
}
- if (p->delayMechanism == DM_E2E) {
- pr_warning("%s: pdelay_req on E2E port", p->log_name);
+ if (p->delayMechanism == DM_E2E ||
+ p->delayMechanism == DM_COMMON_P2P) {
+ pr_warning("%s: pdelay_req on E2E or COMMON_P2P port",
p->log_name);
return 0;
}
if (p->delayMechanism == DM_AUTO) {
@@ -2756,7 +2758,7 @@ static void bc_dispatch(struct port *p, enum fsm_event
event, int mdiff)
return;
}
- if (p->delayMechanism == DM_P2P) {
+ if (p->delayMechanism == DM_P2P || p->delayMechanism == DM_COMMON_P2P) {
port_p2p_transition(p, p->state);
} else {
port_e2e_transition(p, p->state);
@@ -2895,6 +2897,7 @@ static enum fsm_event bc_event(struct port *p, int
fd_index)
delay_req_prune(p);
if (clock_slave_only(p->clock) && p->delayMechanism != DM_P2P &&
+ p->delayMechanism != DM_COMMON_P2P &&
port_renew_transport(p)) {
return EV_FAULT_DETECTED;
}
diff --git a/unicast_client.c b/unicast_client.c
index 0843554e355a..9053acc0b599 100644
--- a/unicast_client.c
+++ b/unicast_client.c
@@ -202,6 +202,7 @@ static int unicast_client_renew(struct port *p,
goto out;
}
if (p->delayMechanism != DM_P2P &&
+ p->delayMechanism != DM_COMMON_P2P &&
p->delayMechanism != DM_NO_MECHANISM) {
err = attach_request(msg, p->logMinDelayReqInterval,
DELAY_RESP,
@@ -256,6 +257,7 @@ static int unicast_client_sydy(struct port *p,
goto out;
}
if (p->delayMechanism != DM_P2P &&
+ p->delayMechanism != DM_COMMON_P2P &&
p->delayMechanism != DM_NO_MECHANISM) {
err = attach_request(msg, p->logMinDelayReqInterval, DELAY_RESP,
p->unicast_req_duration);
@@ -404,7 +406,8 @@ int unicast_client_initialize(struct port *p)
pr_warning("%s: unicast master transport mismatch",
p->log_name);
}
- if (p-