As per IEEE1588-2019, Table 21 adding NO_MECHANISM support. In this
case port does not implement the delay mechanism.

Signed-off-by: Greg Armstrong <greg.armstrong...@renesas.com>
Signed-off-by: Leon Goldin <leon.goldin...@renesas.com>
Signed-off-by: Devasish Dey <devasish....@syncmonk.net>
Signed-off-by: Vipin Sharma <vipin.sha...@syncmonk.net>
---
 config.c         | 16 +++++++++-------
 dm.h             |  3 +++
 port.c           |  7 +++++--
 ptp4l.c          |  8 +++++++-
 tsproc.c         |  5 +++++
 tsproc.h         |  1 +
 unicast_client.c | 11 ++++++++---
 7 files changed, 38 insertions(+), 13 deletions(-)

diff --git a/config.c b/config.c
index 6ba9996..fe48b46 100644
--- a/config.c
+++ b/config.c
@@ -168,9 +168,10 @@ static struct config_enum delay_filter_enu[] = {
 };
 
 static struct config_enum delay_mech_enu[] = {
-       { "Auto", DM_AUTO },
-       { "E2E",  DM_E2E },
-       { "P2P",  DM_P2P },
+       { "Auto",         DM_AUTO },
+       { "E2E",          DM_E2E },
+       { "P2P",          DM_P2P },
+       { "NO_MECHANISM", DM_NO_MECHANISM },
        { NULL, 0 },
 };
 
@@ -205,10 +206,11 @@ static struct config_enum timestamping_enu[] = {
 };
 
 static struct config_enum tsproc_enu[] = {
-       { "filter",        TSPROC_FILTER        },
-       { "raw",           TSPROC_RAW           },
-       { "filter_weight", TSPROC_FILTER_WEIGHT },
-       { "raw_weight",    TSPROC_RAW_WEIGHT    },
+       { "filter",        TSPROC_FILTER                },
+       { "raw",           TSPROC_RAW           },
+       { "filter_weight", TSPROC_FILTER_WEIGHT },
+       { "raw_weight",    TSPROC_RAW_WEIGHT    },
+       { "no_delay",      TSPROC_NO_DELAY_MECHANISM    },
        { NULL, 0 },
 };
 
diff --git a/dm.h b/dm.h
index 2491c63..47bd847 100644
--- a/dm.h
+++ b/dm.h
@@ -33,6 +33,9 @@ enum delay_mechanism {
 
        /** Peer delay mechanism. */
        DM_P2P,
+
+       /** No Delay Mechanism. */
+       DM_NO_MECHANISM = 0xFE,
 };
 
 #endif
diff --git a/port.c b/port.c
index d9dac38..cba48ae 100644
--- a/port.c
+++ b/port.c
@@ -1195,7 +1195,7 @@ int port_set_announce_tmo(struct port *p)
 
 int port_set_delay_tmo(struct port *p)
 {
-       if (p->inhibit_delay_req) {
+       if (p->inhibit_delay_req || p->delayMechanism == DM_NO_MECHANISM) {
                return 0;
        }
 
@@ -2031,7 +2031,10 @@ static int process_delay_req(struct port *p, struct 
ptp_message *m)
                return 0;
        }
 
-       if (p->delayMechanism == DM_P2P) {
+       if (p->delayMechanism == DM_NO_MECHANISM) {
+               pr_warning("port %hu: delay request not supported", portnum(p));
+               return 0;
+       } else if (p->delayMechanism == DM_P2P) {
                pr_warning("%s: delay request on P2P port", p->log_name);
                return 0;
        }
diff --git a/ptp4l.c b/ptp4l.c
index c61175b..3e88e87 100644
--- a/ptp4l.c
+++ b/ptp4l.c
@@ -43,7 +43,8 @@ static void usage(char *progname)
                " Delay Mechanism\n\n"
                " -A        Auto, starting with E2E\n"
                " -E        E2E, delay request-response (default)\n"
-               " -P        P2P, peer delay mechanism\n\n"
+               " -P        P2P, peer delay mechanism\n"
+               " -N        NO_MECHANISM, no mechanism\n"
                " Network Transport\n\n"
                " -2        IEEE 802.3\n"
                " -4        UDP IPV4 (default)\n"
@@ -108,6 +109,11 @@ int main(int argc, char *argv[])
                        if (config_set_int(cfg, "delay_mechanism", DM_P2P))
                                goto out;
                        break;
+               case 'N':
+                       if (config_set_int(cfg,
+                               "delay_mechanism", DM_NO_MECHANISM))
+                               goto out;
+                       break;
                case '2':
                        if (config_set_int(cfg, "network_transport",
                                            TRANS_IEEE_802_3))
diff --git a/tsproc.c b/tsproc.c
index a871049..feb0ea5 100644
--- a/tsproc.c
+++ b/tsproc.c
@@ -52,6 +52,7 @@ static int weighting(struct tsproc *tsp)
        switch (tsp->mode) {
        case TSPROC_FILTER:
        case TSPROC_RAW:
+       case TSPROC_NO_DELAY_MECHANISM:
                return 0;
        case TSPROC_FILTER_WEIGHT:
        case TSPROC_RAW_WEIGHT:
@@ -74,6 +75,7 @@ struct tsproc *tsproc_create(enum tsproc_mode mode,
        case TSPROC_RAW:
        case TSPROC_FILTER_WEIGHT:
        case TSPROC_RAW_WEIGHT:
+       case TSPROC_NO_DELAY_MECHANISM:
                tsp->mode = mode;
                break;
        default:
@@ -171,6 +173,7 @@ int tsproc_update_delay(struct tsproc *tsp, tmv_t *delay)
                break;
        case TSPROC_RAW:
        case TSPROC_RAW_WEIGHT:
+       case TSPROC_NO_DELAY_MECHANISM:
                *delay = raw_delay;
                break;
        }
@@ -207,6 +210,8 @@ int tsproc_update_offset(struct tsproc *tsp, tmv_t *offset, 
double *weight)
                raw_delay = get_raw_delay(tsp);
                delay = tsp->filtered_delay;
                break;
+       case TSPROC_NO_DELAY_MECHANISM:
+               break;
        }
 
        /* offset = t2 - t1 - delay */
diff --git a/tsproc.h b/tsproc.h
index fdb35a8..f4ec491 100644
--- a/tsproc.h
+++ b/tsproc.h
@@ -33,6 +33,7 @@ enum tsproc_mode {
        TSPROC_RAW,
        TSPROC_FILTER_WEIGHT,
        TSPROC_RAW_WEIGHT,
+       TSPROC_NO_DELAY_MECHANISM,
 };
 
 /**
diff --git a/unicast_client.c b/unicast_client.c
index 8ebe06f..ff3f2c5 100644
--- a/unicast_client.c
+++ b/unicast_client.c
@@ -26,6 +26,7 @@
 
 #define E2E_SYDY_MASK  (1 << ANNOUNCE | 1 << SYNC | 1 << DELAY_RESP)
 #define P2P_SYDY_MASK  (1 << ANNOUNCE | 1 << SYNC)
+#define E2E_SYDY_NO_MECHANISM (1 << ANNOUNCE | 1 << SYNC)
 
 static int attach_ack(struct ptp_message *msg, uint8_t message_type_flags)
 {
@@ -200,7 +201,8 @@ static int unicast_client_renew(struct port *p,
                if (err) {
                        goto out;
                }
-               if (p->delayMechanism != DM_P2P) {
+               if (p->delayMechanism != DM_P2P &&
+                               p->delayMechanism != DM_NO_MECHANISM) {
                        err = attach_request(msg, p->logMinDelayReqInterval,
                                             DELAY_RESP,
                                             p->unicast_req_duration);
@@ -253,9 +255,10 @@ static int unicast_client_sydy(struct port *p,
        if (err) {
                goto out;
        }
-       if (p->delayMechanism != DM_P2P) {
+       if (p->delayMechanism != DM_P2P &&
+                       p->delayMechanism != DM_NO_MECHANISM) {
                err = attach_request(msg, p->logMinDelayReqInterval, DELAY_RESP,
-                                    p->unicast_req_duration);
+                               p->unicast_req_duration);
                if (err) {
                        goto out;
                }
@@ -400,6 +403,8 @@ int unicast_client_initialize(struct port *p)
                }
                if (p->delayMechanism == DM_P2P) {
                        master->sydymsk = P2P_SYDY_MASK;
+               } else if (p->delayMechanism == DM_NO_MECHANISM) {
+                       master->sydymsk = E2E_SYDY_NO_MECHANISM;
                } else {
                        master->sydymsk = E2E_SYDY_MASK;
                }
-- 
2.17.1



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

Reply via email to