|
|
7a40ed |
From da1a564439208f91b22f2af499b752b7a5ce3662 Mon Sep 17 00:00:00 2001
|
|
|
7a40ed |
From: Vadim Fedorenko <vadfed@meta.com>
|
|
|
7a40ed |
Date: Thu, 5 Jan 2023 08:22:26 -0800
|
|
|
7a40ed |
Subject: [PATCH 1/2] unicast client: do not fail on absence of TX timestamp
|
|
|
7a40ed |
|
|
|
7a40ed |
There is a possibility of no TX timestamp even if sendto()
|
|
|
7a40ed |
ended up with no error. Packet could be dropped because of hardware
|
|
|
7a40ed |
overflow or qdisc drops. Let's re-try sending delay request in this
|
|
|
7a40ed |
case.
|
|
|
7a40ed |
|
|
|
7a40ed |
Signed-off-by: Vadim Fedorenko <vadfed@meta.com>
|
|
|
7a40ed |
---
|
|
|
7a40ed |
port.c | 16 ++++++++++++----
|
|
|
7a40ed |
sk.c | 10 +++++++---
|
|
|
7a40ed |
2 files changed, 19 insertions(+), 7 deletions(-)
|
|
|
7a40ed |
|
|
|
7a40ed |
diff --git a/port.c b/port.c
|
|
|
7a40ed |
index a7ce01f..34880c8 100644
|
|
|
7a40ed |
--- a/port.c
|
|
|
7a40ed |
+++ b/port.c
|
|
|
7a40ed |
@@ -647,7 +647,7 @@ static int peer_prepare_and_send(struct port *p, struct ptp_message *msg,
|
|
|
7a40ed |
} else {
|
|
|
7a40ed |
cnt = transport_peer(p->trp, &p->fda, event, msg);
|
|
|
7a40ed |
}
|
|
|
7a40ed |
- if (cnt <= 0) {
|
|
|
7a40ed |
+ if (cnt < 0 || (event != TRANS_EVENT && cnt == 0)) {
|
|
|
7a40ed |
return -1;
|
|
|
7a40ed |
}
|
|
|
7a40ed |
port_stats_inc_tx(p, msg);
|
|
|
7a40ed |
@@ -1504,7 +1504,14 @@ static int port_pdelay_request(struct port *p)
|
|
|
7a40ed |
}
|
|
|
7a40ed |
if (msg_sots_missing(msg)) {
|
|
|
7a40ed |
pr_err("missing timestamp on transmitted peer delay request");
|
|
|
7a40ed |
- goto out;
|
|
|
7a40ed |
+ msg_put(msg);
|
|
|
7a40ed |
+ if (p->peer_delay_req) {
|
|
|
7a40ed |
+ msg_put(p->peer_delay_req);
|
|
|
7a40ed |
+ p->peer_delay_req = NULL;
|
|
|
7a40ed |
+ // we have to clean request to fail if we have really sent the
|
|
|
7a40ed |
+ // request but got no HW timestamps
|
|
|
7a40ed |
+ }
|
|
|
7a40ed |
+ return 0;
|
|
|
7a40ed |
}
|
|
|
7a40ed |
|
|
|
7a40ed |
if (p->peer_delay_req) {
|
|
|
7a40ed |
@@ -1566,8 +1573,9 @@ int port_delay_request(struct port *p)
|
|
|
7a40ed |
goto out;
|
|
|
7a40ed |
}
|
|
|
7a40ed |
if (msg_sots_missing(msg)) {
|
|
|
7a40ed |
+ msg_put(msg);
|
|
|
7a40ed |
pr_err("missing timestamp on transmitted delay request");
|
|
|
7a40ed |
- goto out;
|
|
|
7a40ed |
+ return 0;
|
|
|
7a40ed |
}
|
|
|
7a40ed |
|
|
|
7a40ed |
TAILQ_INSERT_HEAD(&p->delay_req, msg, list);
|
|
|
7a40ed |
@@ -3031,7 +3039,7 @@ int port_prepare_and_send(struct port *p, struct ptp_message *msg,
|
|
|
7a40ed |
} else {
|
|
|
7a40ed |
cnt = transport_send(p->trp, &p->fda, event, msg);
|
|
|
7a40ed |
}
|
|
|
7a40ed |
- if (cnt <= 0) {
|
|
|
7a40ed |
+ if (cnt < 0 || (event != TRANS_EVENT && cnt == 0)) {
|
|
|
7a40ed |
return -1;
|
|
|
7a40ed |
}
|
|
|
7a40ed |
port_stats_inc_tx(p, msg);
|
|
|
7a40ed |
diff --git a/sk.c b/sk.c
|
|
|
7a40ed |
index d27abff..c0073e3 100644
|
|
|
7a40ed |
--- a/sk.c
|
|
|
7a40ed |
+++ b/sk.c
|
|
|
7a40ed |
@@ -357,11 +357,15 @@ int sk_receive(int fd, void *buf, int buflen,
|
|
|
7a40ed |
/* Retry once on EINTR to avoid logging errors before exit */
|
|
|
7a40ed |
if (res < 0 && errno == EINTR)
|
|
|
7a40ed |
res = poll(&pfd, 1, sk_tx_timeout);
|
|
|
7a40ed |
- if (res < 1) {
|
|
|
7a40ed |
- pr_err(res ? "poll for tx timestamp failed: %m" :
|
|
|
7a40ed |
- "timed out while polling for tx timestamp");
|
|
|
7a40ed |
+ if (!res) {
|
|
|
7a40ed |
+ pr_err("timed out while polling for tx timestamp");
|
|
|
7a40ed |
pr_err("increasing tx_timestamp_timeout may correct "
|
|
|
7a40ed |
"this issue, but it is likely caused by a driver bug");
|
|
|
7a40ed |
+ // we return 0 to indicate absence of timestamp
|
|
|
7a40ed |
+ return 0;
|
|
|
7a40ed |
+ }
|
|
|
7a40ed |
+ if (res < 0) {
|
|
|
7a40ed |
+ pr_err("poll for tx timestamp failed: %m");
|
|
|
7a40ed |
return -errno;
|
|
|
7a40ed |
} else if (!(pfd.revents & sk_revents)) {
|
|
|
7a40ed |
pr_err("poll for tx timestamp woke up on non ERR event");
|
|
|
7a40ed |
--
|
|
|
7a40ed |
2.30.2
|
|
|
7a40ed |
|