This option will accomplish 2 things. On the master, it will stop the
announce messages being sent (by disabling FD_MANNO_TIMER timer). On
slave, it will not configure announce message timeouts (by disabling
FD_ANNOUNCE_TIMEOUT timer).

This config option is needed for the Automotive profile as part of
skipping the Best Master Clock Algorithm (BMCA).

Signed-off-by: Vedang Patel <vedang.pa...@intel.com>
---
 config.c            |  1 +
 configs/default.cfg |  1 +
 port.c              | 18 ++++++++++++++----
 port_private.h      |  1 +
 ptp4l.8             |  8 ++++++++
 5 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/config.c b/config.c
index 9046cd84cd70..cac0a74683c6 100644
--- a/config.c
+++ b/config.c
@@ -233,6 +233,7 @@ struct config_item config_tab[] = {
        PORT_ITEM_INT("hybrid_e2e", 0, 0, 1),
        PORT_ITEM_INT("ignore_transport_specific", 0, 0, 1),
        PORT_ITEM_INT("ingressLatency", 0, INT_MIN, INT_MAX),
+       PORT_ITEM_INT("inhibit_announce", 0, 0, 1),
        PORT_ITEM_INT("inhibit_multicast_service", 0, 0, 1),
        GLOB_ITEM_INT("initial_delay", 0, 0, INT_MAX),
        GLOB_ITEM_INT("kernel_leap", 1, 0, 1),
diff --git a/configs/default.cfg b/configs/default.cfg
index dd9fa12db06e..c51da0345343 100644
--- a/configs/default.cfg
+++ b/configs/default.cfg
@@ -33,6 +33,7 @@ masterOnly            0
 G.8275.portDS.localPriority    128
 asCapable               auto
 BMCA                    ptp
+inhibit_announce        0
 #
 # Run time options
 #
diff --git a/port.c b/port.c
index d55ff86f34f7..ea40b5c6a91a 100644
--- a/port.c
+++ b/port.c
@@ -1592,6 +1592,7 @@ int port_initialize(struct port *p)
        p->logMinDelayReqInterval  = config_get_int(cfg, p->name, 
"logMinDelayReqInterval");
        p->peerMeanPathDelay       = 0;
        p->logAnnounceInterval     = config_get_int(cfg, p->name, 
"logAnnounceInterval");
+       p->inhibit_announce        = config_get_int(cfg, p->name, 
"inhibit_announce");
        p->announceReceiptTimeout  = config_get_int(cfg, p->name, 
"announceReceiptTimeout");
        p->syncReceiptTimeout      = config_get_int(cfg, p->name, 
"syncReceiptTimeout");
        p->transportSpecific       = config_get_int(cfg, p->name, 
"transportSpecific");
@@ -2313,7 +2314,9 @@ static void port_e2e_transition(struct port *p, enum 
port_state next)
                break;
        case PS_MASTER:
        case PS_GRAND_MASTER:
-               set_tmo_log(p->fda.fd[FD_MANNO_TIMER], 1, -10); /*~1ms*/
+               if (!p->inhibit_announce) {
+                       set_tmo_log(p->fda.fd[FD_MANNO_TIMER], 1, -10); /*~1ms*/
+               }
                port_set_sync_tx_tmo(p);
                break;
        case PS_PASSIVE:
@@ -2356,7 +2359,9 @@ static void port_p2p_transition(struct port *p, enum 
port_state next)
                break;
        case PS_MASTER:
        case PS_GRAND_MASTER:
-               set_tmo_log(p->fda.fd[FD_MANNO_TIMER], 1, -10); /*~1ms*/
+               if (!p->inhibit_announce) {
+                       set_tmo_log(p->fda.fd[FD_MANNO_TIMER], 1, -10); /*~1ms*/
+               }
                port_set_sync_tx_tmo(p);
                break;
        case PS_PASSIVE:
@@ -2477,9 +2482,14 @@ static enum fsm_event bc_event(struct port *p, int 
fd_index)
        case FD_SYNC_RX_TIMER:
                pr_debug("port %hu: %s timeout", portnum(p),
                         fd_index == FD_SYNC_RX_TIMER ? "rx sync" : "announce");
-               if (p->best)
+               if (p->best) {
                        fc_clear(p->best);
-               port_set_announce_tmo(p);
+               }
+               if (p->inhibit_announce) {
+                       port_clr_tmo(p->fda.fd[FD_ANNOUNCE_TIMER]);
+               } else {
+                       port_set_announce_tmo(p);
+               }
                port_clr_tmo(p->fda.fd[FD_SYNC_RX_TIMER]);
                delay_req_prune(p);
                if (clock_slave_only(p->clock) && p->delayMechanism != DM_P2P &&
diff --git a/port_private.h b/port_private.h
index 4b22976b57eb..ca3c906a0006 100644
--- a/port_private.h
+++ b/port_private.h
@@ -98,6 +98,7 @@ struct port {
        enum port_state (*state_machine)(enum port_state state,
                                         enum fsm_event event, int mdiff);
        int bmca;
+       int inhibit_announce;
        /* portDS */
        struct PortIdentity portIdentity;
        enum port_state     state; /*portState*/
diff --git a/ptp4l.8 b/ptp4l.8
index 262fe2ed02bb..ee1d00b8bdd2 100644
--- a/ptp4l.8
+++ b/ptp4l.8
@@ -676,6 +676,14 @@ assume the slave role. masterOnly (which is a per-port 
config option) can then
 be used to set individual ports to take master role. BMCA is used in the
 Automotive profile to speed up the start time for grand master and slaves. The
 default value is 'ptp' which runs the BMCA related state machines.
+.TP
+.B inhibit_announce
+This will disable the timer for announce messages (i.e. FD_MANNO_TIMER) and
+also the announce message timeout timer (i.e. FD_ANNOUNCE_TIMER). This is used
+by the Automotive profile as part of switching over to a static BMCA. if this
+option is enabled, ignore_source_id has to be enabled in the slave because it
+has no way to identify master identity in Sync and Follow_Up messages. The
+default is 0 (disabled).
 
 .SH UNICAST DISCOVERY OPTIONS
 
-- 
2.7.3



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

Reply via email to