summaryrefslogtreecommitdiffstats
path: root/meta/recipes-extended/iputils/iputils/0005-arping-use-additional-timerfd-to-control-when-timeou.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-extended/iputils/iputils/0005-arping-use-additional-timerfd-to-control-when-timeou.patch')
-rw-r--r--meta/recipes-extended/iputils/iputils/0005-arping-use-additional-timerfd-to-control-when-timeou.patch94
1 files changed, 94 insertions, 0 deletions
diff --git a/meta/recipes-extended/iputils/iputils/0005-arping-use-additional-timerfd-to-control-when-timeou.patch b/meta/recipes-extended/iputils/iputils/0005-arping-use-additional-timerfd-to-control-when-timeou.patch
new file mode 100644
index 0000000000..3b8a8244da
--- /dev/null
+++ b/meta/recipes-extended/iputils/iputils/0005-arping-use-additional-timerfd-to-control-when-timeou.patch
@@ -0,0 +1,94 @@
+From 60a27c76174c0ae23bdafde2bad4fdd18a44a7ea Mon Sep 17 00:00:00 2001
+From: Sami Kerola <kerolasa@iki.fi>
+Date: Sat, 7 Mar 2020 22:03:21 +0000
+Subject: [PATCH] arping: use additional timerfd to control when timeout
+ happens
+
+Trying to determine timeout by adding up interval values is pointlessly
+complicating. With separate timer everything just works.
+
+Addresses: https://github.com/iputils/iputils/issues/259
+Fixes: 1df5350bdc952b14901fde356b17b78c2bcd4cff
+Signed-off-by: Sami Kerola <kerolasa@iki.fi>
+Upstream-Status: Backport [https://github.com/iputils/iputils/commit/e594ca52afde89746b7d79c875fe9d6aea1850ac]
+Signed-off-by: Diego Santa Cruz <Diego.SantaCruz@spinetix.com>
+---
+ arping.c | 29 ++++++++++++++++++++++++++---
+ 1 file changed, 26 insertions(+), 3 deletions(-)
+
+diff --git a/arping.c b/arping.c
+index 61db3a6..7284351 100644
+--- a/arping.c
++++ b/arping.c
+@@ -670,6 +670,7 @@ static int event_loop(struct run_state *ctl)
+ enum {
+ POLLFD_SIGNAL = 0,
+ POLLFD_TIMER,
++ POLLFD_TIMEOUT,
+ POLLFD_SOCKET,
+ POLLFD_COUNT
+ };
+@@ -686,6 +687,13 @@ static int event_loop(struct run_state *ctl)
+ .it_value.tv_sec = ctl->interval,
+ .it_value.tv_nsec = 0
+ };
++ int timeoutfd;
++ struct itimerspec timeoutfd_vals = {
++ .it_interval.tv_sec = ctl->timeout,
++ .it_interval.tv_nsec = 0,
++ .it_value.tv_sec = ctl->timeout,
++ .it_value.tv_nsec = 0
++ };
+ uint64_t exp, total_expires = 1;
+
+ unsigned char packet[4096];
+@@ -709,7 +717,7 @@ static int event_loop(struct run_state *ctl)
+ pfds[POLLFD_SIGNAL].fd = sfd;
+ pfds[POLLFD_SIGNAL].events = POLLIN | POLLERR | POLLHUP;
+
+- /* timerfd */
++ /* interval timerfd */
+ tfd = timerfd_create(CLOCK_MONOTONIC, 0);
+ if (tfd == -1) {
+ error(0, errno, "timerfd_create failed");
+@@ -722,6 +730,19 @@ static int event_loop(struct run_state *ctl)
+ pfds[POLLFD_TIMER].fd = tfd;
+ pfds[POLLFD_TIMER].events = POLLIN | POLLERR | POLLHUP;
+
++ /* timeout timerfd */
++ timeoutfd = timerfd_create(CLOCK_MONOTONIC, 0);
++ if (tfd == -1) {
++ error(0, errno, "timerfd_create failed");
++ return 1;
++ }
++ if (timerfd_settime(timeoutfd, 0, &timeoutfd_vals, NULL)) {
++ error(0, errno, "timerfd_settime failed");
++ return 1;
++ }
++ pfds[POLLFD_TIMEOUT].fd = timeoutfd;
++ pfds[POLLFD_TIMEOUT].events = POLLIN | POLLERR | POLLHUP;
++
+ /* socket */
+ pfds[POLLFD_SOCKET].fd = ctl->socketfd;
+ pfds[POLLFD_SOCKET].events = POLLIN | POLLERR | POLLHUP;
+@@ -764,13 +785,15 @@ static int event_loop(struct run_state *ctl)
+ continue;
+ }
+ total_expires += exp;
+- if ((0 < ctl->count && (uint64_t)ctl->count < total_expires) ||
+- (ctl->quit_on_reply && ctl->timeout < (long)total_expires)) {
++ if (0 < ctl->count && (uint64_t)ctl->count < total_expires) {
+ exit_loop = 1;
+ continue;
+ }
+ send_pack(ctl);
+ break;
++ case POLLFD_TIMEOUT:
++ exit_loop = 1;
++ break;
+ case POLLFD_SOCKET:
+ if ((s =
+ recvfrom(ctl->socketfd, packet, sizeof(packet), 0,
+--
+2.18.4
+