diff --git a/fd.h b/fd.h index 23401f4..78d1141 100644 --- a/fd.h +++ b/fd.h @@ -22,12 +22,18 @@ #define N_TIMER_FDS 6 +/* + * The order matters here. The DELAY timer must appear before the + * ANNOUNCE and SYNC_RX timers in order to correctly handle the case + * when the DELAY timer and one of the other two expire during the + * same call to poll(). + */ enum { FD_EVENT, FD_GENERAL, + FD_DELAY_TIMER, FD_ANNOUNCE_TIMER, FD_SYNC_RX_TIMER, - FD_DELAY_TIMER, FD_QUALIFICATION_TIMER, FD_MANNO_TIMER, FD_SYNC_TX_TIMER, @@ -35,6 +41,8 @@ enum { N_POLLFD, }; +#define FD_FIRST_TIMER FD_DELAY_TIMER + struct fdarray { int fd[N_POLLFD]; }; diff --git a/port.c b/port.c index d0e3ca0..1ee05fe 100644 --- a/port.c +++ b/port.c @@ -1545,7 +1545,7 @@ void port_disable(struct port *p) transport_close(p->trp, &p->fda); for (i = 0; i < N_TIMER_FDS; i++) { - close(p->fda.fd[FD_ANNOUNCE_TIMER + i]); + close(p->fda.fd[FD_FIRST_TIMER + i]); } /* Keep rtnl socket to get link status info. */ @@ -1590,7 +1590,7 @@ int port_initialize(struct port *p) goto no_tropen; for (i = 0; i < N_TIMER_FDS; i++) { - p->fda.fd[FD_ANNOUNCE_TIMER + i] = fd[i]; + p->fda.fd[FD_FIRST_TIMER + i] = fd[i]; } if (port_set_announce_tmo(p)) @@ -1628,7 +1628,7 @@ static int port_renew_transport(struct port *p) return 0; } transport_close(p->trp, &p->fda); - port_clear_fda(p, FD_ANNOUNCE_TIMER); + port_clear_fda(p, FD_FIRST_TIMER); res = transport_open(p->trp, p->iface, &p->fda, p->timestamping); /* Need to call clock_fda_changed even if transport_open failed in * order to update clock to the now closed descriptors. */