traceroute: even with -v, don't show other ping processes reply's
function old new delta
traceroute_init 1135 1151 +16
common_ping_main 1919 1935 +16
common_traceroute_main 1715 1668 -47
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/1 up/down: 32/-47) Total: -15 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
diff --git a/networking/ping.c b/networking/ping.c
index 5f7e5b9..318d561 100644
--- a/networking/ping.c
+++ b/networking/ping.c
@@ -332,6 +332,11 @@
create_icmp_socket(lsa);
G.myid = (uint16_t) getpid();
+ /* we can use native-endian ident, but other Unix ping/traceroute
+ * utils use *big-endian pid*, and e.g. traceroute on our machine may be
+ * *not* from busybox, idents may collide. Follow the convention:
+ */
+ G.myid = htons(G.myid);
#if ENABLE_PING6
if (lsa->u.sa.sa_family == AF_INET6)
ping6(lsa);
@@ -927,6 +932,11 @@
G.interval_us = interval * 1000000;
myid = (uint16_t) getpid();
+ /* we can use native-endian ident, but other Unix ping/traceroute
+ * utils use *big-endian pid*, and e.g. traceroute on our machine may be
+ * *not* from busybox, idents may collide. Follow the convention:
+ */
+ myid = htons(myid);
hostname = argv[optind];
#if ENABLE_PING6
{
diff --git a/networking/traceroute.c b/networking/traceroute.c
index 8ab4cae..c1eb2d9 100644
--- a/networking/traceroute.c
+++ b/networking/traceroute.c
@@ -659,9 +659,11 @@
if ((option_mask32 & OPT_USE_ICMP)
&& type == ICMP_ECHOREPLY
- && icp->icmp_id == ident
&& icp->icmp_seq == htons(seq)
) {
+ if (icp->icmp_id != ident)
+ /* reply to another ping/traceroute from this box? */
+ return 0; /* ignore, silently */
/* In UDP mode, when we reach the machine, we (usually)
* would get "port unreachable" - in ICMP we got "echo reply".
* Simulate "port unreachable" for caller:
@@ -726,9 +728,11 @@
if ((option_mask32 & OPT_USE_ICMP)
&& type == ICMP6_ECHO_REPLY
- && icp->icmp6_id == ident
&& icp->icmp6_seq == htons(seq)
) {
+ if (icp->icmp6_id != ident)
+ /* reply to another ping/traceroute from this box? */
+ return 0; /* ignore, silently */
/* In UDP mode, when we reach the machine, we (usually)
* would get "port unreachable" - in ICMP we got "echo reply".
* Simulate "port unreachable" for caller:
@@ -988,6 +992,11 @@
outip = xzalloc(packlen);
ident = getpid();
+ /* we can use native-endian ident, but other Unix ping/traceroute
+ * utils use *big-endian pid*, and e.g. ping on our machine may be
+ * *not* from busybox, idents may collide. Follow the convention:
+ */
+ ident = htons(ident);
outdata = (void*)(outudp + 1);
if (af == AF_INET) {