traceroute: avoid collecting target local address if !VERBOSE

function                                             old     new   delta
common_traceroute_main                              1542    1537      -5
traceroute_init                                     1151    1101     -50
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-55)             Total: -55 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2020-12-17 17:47:49 +01:00
parent 4bc59a4cf7
commit ff4ca18501

View File

@ -392,7 +392,9 @@ struct globals {
struct outdata_t *outdata; struct outdata_t *outdata;
len_and_sockaddr *dest_lsa; len_and_sockaddr *dest_lsa;
len_and_sockaddr *from_lsa; /* response came from this address */ len_and_sockaddr *from_lsa; /* response came from this address */
#if ENABLE_FEATURE_TRACEROUTE_VERBOSE
struct sockaddr *to; /* response came to this (local) address */ struct sockaddr *to; /* response came to this (local) address */
#endif
uint32_t ident; uint32_t ident;
uint16_t port; /* start udp dest port # for probe packets */ uint16_t port; /* start udp dest port # for probe packets */
#if ENABLE_TRACEROUTE6 #if ENABLE_TRACEROUTE6
@ -463,10 +465,17 @@ wait_for_reply(unsigned *timestamp_us, int *left_ms)
if (*left_ms >= 0 && safe_poll(pfd, 1, *left_ms) > 0) { if (*left_ms >= 0 && safe_poll(pfd, 1, *left_ms) > 0) {
unsigned t; unsigned t;
#if ENABLE_FEATURE_TRACEROUTE_VERBOSE
read_len = recv_from_to(rcvsock, read_len = recv_from_to(rcvsock,
recv_pkt, sizeof(recv_pkt), recv_pkt, sizeof(recv_pkt),
/*flags:*/ MSG_DONTWAIT, /*flags:*/ MSG_DONTWAIT,
&G.from_lsa->u.sa, G.to, G.from_lsa->len); &G.from_lsa->u.sa, G.to, G.from_lsa->len);
#else
read_len = recvfrom(rcvsock,
recv_pkt, sizeof(recv_pkt),
/*flags:*/ MSG_DONTWAIT,
&G.from_lsa->u.sa, &G.from_lsa->len);
#endif
if (read_len < 0) if (read_len < 0)
bb_perror_msg_and_die("recv"); bb_perror_msg_and_die("recv");
t = monotonic_us(); t = monotonic_us();
@ -724,6 +733,12 @@ packet6_ok(int read_len, int seq)
* return only ICMP packet (IOW: they strip IPv6 header). * return only ICMP packet (IOW: they strip IPv6 header).
* This differs from (AF_INET, SOCK_RAW, IPPROTO_ICMP) sockets!? * This differs from (AF_INET, SOCK_RAW, IPPROTO_ICMP) sockets!?
*/ */
if (read_len < ICMP_MINLEN) {
if (verbose)
printf("packet too short (%d bytes) from %s\n", read_len,
auto_string(xmalloc_sockaddr2dotted_noport(&G.from_lsa->u.sa)));
return 0;
}
icp = (struct icmp6_hdr *) recv_pkt; icp = (struct icmp6_hdr *) recv_pkt;
type = icp->icmp6_type; type = icp->icmp6_type;
@ -789,7 +804,12 @@ packet_ok(int read_len, int seq)
#endif #endif
static void static void
#if !ENABLE_FEATURE_TRACEROUTE_VERBOSE
print(void)
# define print(len) print()
#else
print(int read_len) print(int read_len)
#endif
{ {
char *ina = auto_string(xmalloc_sockaddr2dotted_noport(&G.from_lsa->u.sa)); char *ina = auto_string(xmalloc_sockaddr2dotted_noport(&G.from_lsa->u.sa));
@ -806,8 +826,9 @@ print(int read_len)
printf(" %s (%s)", (n ? n : ina), ina); printf(" %s (%s)", (n ? n : ina), ina);
} }
#if ENABLE_FEATURE_TRACEROUTE_VERBOSE
if (verbose) { if (verbose) {
#if ENABLE_TRACEROUTE6 # if ENABLE_TRACEROUTE6
/* NB: reads from (AF_INET, SOCK_RAW, IPPROTO_ICMP) socket /* NB: reads from (AF_INET, SOCK_RAW, IPPROTO_ICMP) socket
* return the entire IP packet (IOW: they do not strip IP header). * return the entire IP packet (IOW: they do not strip IP header).
* Reads from (AF_INET6, SOCK_RAW, IPPROTO_ICMPV6) do strip IPv6 * Reads from (AF_INET6, SOCK_RAW, IPPROTO_ICMPV6) do strip IPv6
@ -816,7 +837,7 @@ print(int read_len)
if (G_ipv6) { if (G_ipv6) {
/* read_len -= sizeof(struct ip6_hdr); - WRONG! */ /* read_len -= sizeof(struct ip6_hdr); - WRONG! */
} else } else
#endif # endif
{ {
struct ip *ip4packet = (struct ip*)recv_pkt; struct ip *ip4packet = (struct ip*)recv_pkt;
read_len -= ip4packet->ip_hl << 2; read_len -= ip4packet->ip_hl << 2;
@ -825,6 +846,7 @@ print(int read_len)
auto_string(xmalloc_sockaddr2dotted_noport(G.to)) auto_string(xmalloc_sockaddr2dotted_noport(G.to))
); );
} }
#endif
} }
static void static void
@ -925,20 +947,26 @@ traceroute_init(int op, char **argv)
dest_lsa = xhost_and_af2sockaddr(argv[0], port, AF_INET); dest_lsa = xhost_and_af2sockaddr(argv[0], port, AF_INET);
#endif #endif
G.from_lsa = xmemdup(dest_lsa, LSA_LEN_SIZE + dest_lsa->len); G.from_lsa = xmemdup(dest_lsa, LSA_LEN_SIZE + dest_lsa->len);
#if ENABLE_FEATURE_TRACEROUTE_VERBOSE
G.to = xzalloc(dest_lsa->len); G.to = xzalloc(dest_lsa->len);
#endif
if (argv[1]) if (argv[1])
packlen = xatoul_range(argv[1], packlen, 32 * 1024); packlen = xatoul_range(argv[1], packlen, 32 * 1024);
if (af == AF_INET) { if (af == AF_INET) {
xmove_fd(xsocket(AF_INET, SOCK_RAW, IPPROTO_ICMP), rcvsock); xmove_fd(xsocket(AF_INET, SOCK_RAW, IPPROTO_ICMP), rcvsock);
#if ENABLE_FEATURE_TRACEROUTE_VERBOSE
/* want recvmsg to report target local address (for -v) */ /* want recvmsg to report target local address (for -v) */
setsockopt_1(rcvsock, IPPROTO_IP, IP_PKTINFO); setsockopt_1(rcvsock, IPPROTO_IP, IP_PKTINFO);
#endif
} }
#if ENABLE_TRACEROUTE6 #if ENABLE_TRACEROUTE6
else { else {
xmove_fd(xsocket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6), rcvsock); xmove_fd(xsocket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6), rcvsock);
# if ENABLE_FEATURE_TRACEROUTE_VERBOSE
/* want recvmsg to report target local address (for -v) */ /* want recvmsg to report target local address (for -v) */
setsockopt_1(rcvsock, SOL_IPV6, IPV6_RECVPKTINFO); setsockopt_1(rcvsock, SOL_IPV6, IPV6_RECVPKTINFO);
# endif
} }
#endif #endif
#if TRACEROUTE_SO_DEBUG #if TRACEROUTE_SO_DEBUG
@ -1231,7 +1259,9 @@ common_traceroute_main(int op, char **argv)
} }
if (ENABLE_FEATURE_CLEAN_UP) { if (ENABLE_FEATURE_CLEAN_UP) {
#if ENABLE_FEATURE_TRACEROUTE_VERBOSE
free(G.to); free(G.to);
#endif
free(lastaddr); free(lastaddr);
free(G.from_lsa); free(G.from_lsa);
} }