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

Reply via email to