port_cmlds_ignore() assesses incoming messages per the following
policy:

* All messages that bear the CMLDS sdoid/domainNumber are directed
to a CMLDS Link Port context and processed by this function. All other
messages go through the regular flow (i.e. port_ignore() and beyond)
based on the the ptp4l instance configuration.

* PDELAY_REQ, PDELAY_RESP, PDELAY_RESP_FOLLOW_UP and management
messages for MID_CMLDS_INFO_NP are the only expected message types
at a CMLDS Link Port. All other received messages at a CMLDS Link Port
(i.e., bearing the CMLDS sdoid/domainNumber) are ignored.

Signed-off-by: Kishen Maloor <kishen.mal...@intel.com>
---
 port.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 65 insertions(+), 2 deletions(-)

diff --git a/port.c b/port.c
index e632316aa492..9040453fb2dc 100644
--- a/port.c
+++ b/port.c
@@ -772,9 +772,62 @@ int port_clr_tmo(int fd)
        return timerfd_settime(fd, 0, &tmo, NULL);
 }
 
+static int port_cmlds_ignore(struct port *p, struct ptp_message *m)
+{
+       struct management_tlv *mgt = (struct management_tlv *)
+                                       m->management.suffix;
+
+       /* Messages that do not bear the CMLDS sdoid/domainNumber
+        * are unrelated to CMLDS.
+        */
+       if (msg_transport_specific(m) != CMLDS_TRANSPORTSPECIFIC ||
+           m->header.domainNumber != CMLDS_DOMAINNUMBER) {
+               /* MID_CMLDS_INFO_NP may only be accessed using the CMLDS
+                * sdoid/domainNumber.
+                */
+               if (msg_type(m) == MANAGEMENT &&
+                   mgt->id == MID_CMLDS_INFO_NP) {
+                       return -1;
+               }
+               return 0;
+       }
+
+       /* CMLDS messages */
+       if (msg_transport_specific(m) == CMLDS_TRANSPORTSPECIFIC) {
+               /* Only MID_CMLDS_INFO_NP may be accessed using the CMLDS
+                * sdoid/domainNumber. Ignore anything else.
+                */
+               if (msg_type(m) == MANAGEMENT &&
+                   mgt->id != MID_CMLDS_INFO_NP)
+                       return -1;
+
+               /* Ignore CMLDS messages received at a port that does
+                * not expose CMLDS.
+                * Note: Messages across ptp4l instacnes to/from
+                * MID_CMLDS_INFO_NP currently propagate over the UDS.
+                */
+               if (!port_is_uds(p) && !port_cmlds_enabled(p)) {
+                       return -1;
+               }
+
+               /* Only the following message types are permitted to/from
+                * the CMLDS. Ignore anything else.
+                */
+               if (msg_type(m) != MANAGEMENT &&
+                   msg_type(m) != PDELAY_REQ &&
+                   msg_type(m) != PDELAY_RESP &&
+                   msg_type(m) != PDELAY_RESP_FOLLOW_UP) {
+                       return -1;
+               }
+       }
+       /* This is a permitted CMLDS PDELAY or MANAGEMENT message */
+       return 1;
+}
+
 static int port_ignore(struct port *p, struct ptp_message *m)
 {
        struct ClockIdentity c1, c2;
+       int cmlds = 0;
 
        if (port_is_uds(p) && msg_type(m) != MANAGEMENT) {
                return 1;
@@ -785,14 +838,24 @@ static int port_ignore(struct port *p, struct ptp_message 
*m)
        if (path_trace_ignore(p, m)) {
                return 1;
        }
-       if (p->match_transport_specific &&
+
+       /* Ignore non-permitted CMLDS messages */
+       if ((cmlds = port_cmlds_ignore(p, m)) == -1)
+               return 1;
+
+       /* Suppress transportSpecific/domainNumber matching below for
+        * mesaages to/from the CMLDS as the requisite checks have
+        * already been performed by port_cmlds_ignore()
+        */
+       if (!cmlds && p->match_transport_specific &&
            msg_transport_specific(m) != p->transportSpecific) {
                return 1;
        }
        if (pid_eq(&m->header.sourcePortIdentity, &p->portIdentity)) {
                return 1;
        }
-       if (m->header.domainNumber != clock_domain_number(p->clock)) {
+       if (!cmlds &&
+           m->header.domainNumber != clock_domain_number(p->clock)) {
                return 1;
        }
 
-- 
2.31.1



_______________________________________________
Linuxptp-devel mailing list
Linuxptp-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel

Reply via email to