From 1cbeec80cd7b2f170a02d9fa6b071345645477ca Mon Sep 17 00:00:00 2001 From: Vedang Patel Date: Wed, 3 Oct 2018 09:41:51 -0700 Subject: [PATCH] Add inhibit_announce config option. 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 --- config.c | 1 + configs/default.cfg | 1 + port.c | 19 +++++++++++++++---- port_private.h | 1 + ptp4l.8 | 8 ++++++++ 5 files changed, 26 insertions(+), 4 deletions(-) diff --git a/config.c b/config.c index 78b578b..a018066 100644 --- a/config.c +++ b/config.c @@ -242,6 +242,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 de346a3..b791ea3 100644 --- a/configs/default.cfg +++ b/configs/default.cfg @@ -34,6 +34,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 96e536f..bf6860c 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"); @@ -2310,7 +2311,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: @@ -2353,7 +2356,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: @@ -2474,9 +2479,9 @@ 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); + } /* * Clear out the event returned by poll(). It is only cleared @@ -2487,6 +2492,12 @@ static enum fsm_event bc_event(struct port *p, int fd_index) port_clr_tmo(p->fda.fd[FD_SYNC_RX_TIMER]); } + if (p->inhibit_announce) { + port_clr_tmo(p->fda.fd[FD_ANNOUNCE_TIMER]); + } else { + port_set_announce_tmo(p); + } + delay_req_prune(p); if (clock_slave_only(p->clock) && p->delayMechanism != DM_P2P && port_renew_transport(p)) { diff --git a/port_private.h b/port_private.h index 4b22976..ca3c906 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 a4a31a3..d4133a8 100644 --- a/ptp4l.8 +++ b/ptp4l.8 @@ -701,6 +701,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