commit c304dbe4060da421a9bf089188c5016ef97aacf1 Author: Vadim Fedorenko Date: Fri Jan 13 12:34:34 2023 -0800 unicast_client: further improve CANCEL logic bc_dispatch should work right after recieving CANCEL otherwise state machine can stuck in HAVE_ANN state. Also another code to be safe on this side and recover selected best master from being stuck in HAVE_ANN state. Signed-off-by: Vadim Fedorenko diff --git a/port.c b/port.c index 6b5483f..02b49a1 100644 --- a/port.c +++ b/port.c @@ -2982,8 +2982,11 @@ static enum fsm_event bc_event(struct port *p, int fd_index) event = EV_STATE_DECISION_EVENT; break; case SIGNALING: - if (process_signaling(p, msg)) { + err = process_signaling(p, msg); + if (err < 0) { event = EV_FAULT_DETECTED; + } else if (err) { + event = EV_STATE_DECISION_EVENT; } break; case MANAGEMENT: diff --git a/unicast_client.c b/unicast_client.c index 81113ae..633a4fe 100644 --- a/unicast_client.c +++ b/unicast_client.c @@ -363,7 +363,7 @@ int unicast_client_cancel(struct port *p, struct ptp_message *m, } out: msg_put(msg); - return err; + return err ? err : 1; } int unicast_client_initialize(struct port *p) @@ -433,6 +433,7 @@ int unicast_client_enabled(struct port *p) void unicast_client_grant(struct port *p, struct ptp_message *m, struct tlv_extra *extra) { + struct PortIdentity pid = clock_parent_identity(p->clock); struct unicast_master_address *ucma; struct grant_unicast_xmit_tlv *g; int mtype; @@ -478,6 +479,15 @@ void unicast_client_grant(struct port *p, struct ptp_message *m, switch (ucma->state) { case UC_HAVE_ANN: + if (mtype == ANNOUNCE) { + if (pid_eq(&ucma->portIdentity, &pid)) { + ucma->state = UC_NEED_SYDY; + pr_warning("received ANNOUNCE grant for current master in UC_HAVE_ANN state, unblocking"); + } + ucma->portIdentity = m->header.sourcePortIdentity; + unicast_client_set_renewal(p, ucma, g->durationField); + } + break; case UC_WAIT: if (mtype == ANNOUNCE) { ucma->state = unicast_fsm(ucma->state, UC_EV_GRANT_ANN);