There is a possibility of no TX timestamp even if sendto() ended up with no error. Packet could be dropped because of hardware overflow or qdisc drops. Let's re-try sending delay request in this case.
Signed-off-by: Vadim Fedorenko <vad...@meta.com> --- port.c | 14 +++++++++++--- sk.c | 10 +++++++--- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/port.c b/port.c index b6448ae..1ee830d 100644 --- a/port.c +++ b/port.c @@ -647,7 +647,7 @@ static int peer_prepare_and_send(struct port *p, struct ptp_message *msg, } else { cnt = transport_peer(p->trp, &p->fda, event, msg); } - if (cnt <= 0) { + if (cnt < 0 || (event != TRANS_EVENT && cnt == 0)) { return -1; } port_stats_inc_tx(p, msg); @@ -1504,7 +1504,14 @@ static int port_pdelay_request(struct port *p) } if (msg_sots_missing(msg)) { pr_err("missing timestamp on transmitted peer delay request"); - goto out; + msg_put(msg); + if (p->peer_delay_req) { + msg_put(p->peer_delay_req); + p->peer_delay_req = NULL; + // we have to clean request to fail if we have really sent the + // request but got no HW timestamps + } + return 0; } if (p->peer_delay_req) { @@ -1567,7 +1574,8 @@ int port_delay_request(struct port *p) } if (msg_sots_missing(msg)) { pr_err("missing timestamp on transmitted delay request"); - goto out; + msg_put(msg); + return 0; } TAILQ_INSERT_HEAD(&p->delay_req, msg, list); diff --git a/sk.c b/sk.c index d27abff..c0073e3 100644 --- a/sk.c +++ b/sk.c @@ -357,11 +357,15 @@ int sk_receive(int fd, void *buf, int buflen, /* Retry once on EINTR to avoid logging errors before exit */ if (res < 0 && errno == EINTR) res = poll(&pfd, 1, sk_tx_timeout); - if (res < 1) { - pr_err(res ? "poll for tx timestamp failed: %m" : - "timed out while polling for tx timestamp"); + if (!res) { + pr_err("timed out while polling for tx timestamp"); pr_err("increasing tx_timestamp_timeout may correct " "this issue, but it is likely caused by a driver bug"); + // we return 0 to indicate absence of timestamp + return 0; + } + if (res < 0) { + pr_err("poll for tx timestamp failed: %m"); return -errno; } else if (!(pfd.revents & sk_revents)) { pr_err("poll for tx timestamp woke up on non ERR event"); -- 2.30.2 _______________________________________________ Linuxptp-devel mailing list Linuxptp-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxptp-devel