summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--daemons/gptp/common/ptp_message.cpp57
1 files changed, 52 insertions, 5 deletions
diff --git a/daemons/gptp/common/ptp_message.cpp b/daemons/gptp/common/ptp_message.cpp
index 01dcb49f..7476abae 100644
--- a/daemons/gptp/common/ptp_message.cpp
+++ b/daemons/gptp/common/ptp_message.cpp
@@ -1340,6 +1340,13 @@ void PTPMessagePathDelayRespFollowUp::processMessage(IEEE1588Port * port)
PortIdentity req_id;
PortIdentity resp_id;
+ PortIdentity fup_sourcePortIdentity;
+ PortIdentity resp_sourcePortIdentity;
+ ClockIdentity req_clkId;
+ ClockIdentity resp_clkId;
+
+ uint16_t resp_port_number;
+ uint16_t req_port_number;
if (req == NULL) {
/* Shouldn't happen */
@@ -1358,6 +1365,12 @@ void PTPMessagePathDelayRespFollowUp::processMessage(IEEE1588Port * port)
req->getPortIdentity(&req_id);
resp->getRequestingPortIdentity(&resp_id);
+ req_clkId = req_id.getClockIdentity();
+ resp_clkId = resp_id.getClockIdentity();
+ resp_id.getPortNumber(&resp_port_number);
+ requestingPortIdentity->getPortNumber(&req_port_number);
+ resp->getPortIdentity(&resp_sourcePortIdentity);
+ getPortIdentity(&fup_sourcePortIdentity);
if( req->getSequenceId() != sequenceId ) {
XPTPD_ERROR
@@ -1366,12 +1379,11 @@ void PTPMessagePathDelayRespFollowUp::processMessage(IEEE1588Port * port)
goto abort;
}
+ /*
+ * According to Figure 11-8 of subclause 11.2.15.3, a condition to leave the state
+ * WAITING_FOR_PDELAY_RESP is if the response seqID is the same as the requested.
+ */
if (resp->getSequenceId() != sequenceId) {
- uint16_t resp_port_number;
- uint16_t req_port_number;
- resp_id.getPortNumber(&resp_port_number);
- requestingPortIdentity->getPortNumber(&req_port_number);
-
XPTPD_ERROR
("Received PDelay Response Follow Up but cannot find "
"corresponding response");
@@ -1381,6 +1393,41 @@ void PTPMessagePathDelayRespFollowUp::processMessage(IEEE1588Port * port)
goto abort;
}
+ /*
+ * According to Figure 11-8 of subclause 11.2.15.3, a condition to leave the state
+ * WAITING_FOR_PDELAY_RESP is if the clock identity in the response is the same
+ * as this clock
+ */
+ if (req_clkId != resp_clkId ) {
+ XPTPD_ERROR
+ ("ClockID Resp/Req differs. PDelay Response ClockID: %s PDelay Request ClockID: %s",
+ req_clkId.getIdentityString().c_str(), resp_clkId.getIdentityString().c_str() );
+ goto abort;
+ }
+
+ /*
+ * According to Figure 11-8 of subclause 11.2.15.3, a condition to leave the state
+ * WAITING_FOR_PDELAY_RESP is if the response portID is the same as the requested.
+ */
+ if ( resp_port_number != req_port_number ) {
+ XPTPD_ERROR
+ ("Request port number (%hu) is different from Response port number (%hu)",
+ resp_port_number, req_port_number);
+
+ goto abort;
+ }
+
+ /*
+ * According to Figure 11-8 of subclause 11.2.15.3, a condition to leave the state
+ * WAITING_FOR_PDELAY_RESP is if the sourcePortIdentity from PDelay Response and PDelay
+ * response Follow-UP (FUP) are the same.
+ */
+ if ( fup_sourcePortIdentity != resp_sourcePortIdentity ) {
+ XPTPD_ERROR("Source port identity from PDelay Response/FUP differ");
+
+ goto abort;
+ }
+
port->getClock()->deleteEventTimerLocked
(port, PDELAY_RESP_RECEIPT_TIMEOUT_EXPIRES);