When a reply with an unexpected seqno arrives (for example a late answer to
an already timed out request), ping and traceroute jump back to read_packet
to keep waiting for the real answer. The jump target also re-runs
start_timer(), so the reported round trip time only measures from the
arrival of the stray packet instead of from the transmission of the
request, underreporting the RTT and polluting the min/avg/max statistics.

Start the timer (and initialize the timeout in traceroute) once per
transmitted request. At the same time, let select in icmp_interface_read()
the wait time instead of restarting it each time.

Fixes: 2ecb2c8b060b ("batctl: tr / ping - ignore packets with wrong sequence 
number")
Signed-off-by: Sven Eckelmann <[email protected]>
---
 ping.c       | 2 +-
 traceroute.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/ping.c b/ping.c
index 5eafdad..fcb8d5e 100644
--- a/ping.c
+++ b/ping.c
@@ -215,9 +215,9 @@ static int ping(struct state *state, int argc, char **argv)
 
                packets_out++;
 
-read_packet:
                start_timer();
 
+read_packet:
                read_len = icmp_interface_read((struct batadv_icmp_header 
*)&icmp_packet_in,
                                               packet_len, &tv);
 
diff --git a/traceroute.c b/traceroute.c
index 94443d7..975c9ff 100644
--- a/traceroute.c
+++ b/traceroute.c
@@ -142,12 +142,12 @@ static int traceroute(struct state *state, int argc, char 
**argv)
                                continue;
                        }
 
-read_packet:
                        start_timer();
 
                        tv.tv_sec = 2;
                        tv.tv_usec = 0;
 
+read_packet:
                        read_len = icmp_interface_read((struct 
batadv_icmp_header *)&icmp_packet_in,
                                                       sizeof(icmp_packet_in), 
&tv);
                        if (read_len <= 0)

-- 
2.47.3

Reply via email to