From 2b94c053d1c2a0db88dbc4e1e470ae17c616ed92 Mon Sep 17 00:00:00 2001 From: Alex Samorukov Date: Mon, 4 Jan 2021 01:41:34 +0100 Subject: [PATCH] Fix traceroute applet on the FreeBSD This patch addressing 2 issues: 1. Replacing source/dest with uh_sport/uh_dport. It seems that uh_* members are defined on both Linux and BSD, so no #ifdef here 2. Use SOL_IPV6 instead of SOL_RAW on the FreeBSD to fix IPV6_CHECKSUM setsockopt Signed-off-by: Alex Samorukov Signed-off-by: Denys Vlasenko --- networking/traceroute.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/networking/traceroute.c b/networking/traceroute.c index bd63e4449..8f5cd0bf2 100644 --- a/networking/traceroute.c +++ b/networking/traceroute.c @@ -716,8 +716,8 @@ packet4_ok(int read_len, int seq) // Off: since we do not form the entire IP packet, // but defer it to kernel, we can't set source port, // and thus can't check it here in the reply - /* && up->source == ident */ - && up->dest == htons(port + seq) + /* && up->uh_sport == ident */ + && up->uh_dport == htons(port + seq) ) { return (type == ICMP_TIMXCEED ? -1 : code + 1); } @@ -985,8 +985,13 @@ traceroute_init(int op, char **argv) snd = xsocket(AF_INET, SOCK_DGRAM, 0); } #if ENABLE_TRACEROUTE6 +# if defined(__FreeBSD__) +# define SOL_V6_OPTION SOL_IPV6 +# else +# define SOL_V6_OPTION SOL_RAW +# endif else { - if (setsockopt_int(rcvsock, SOL_RAW, IPV6_CHECKSUM, 2) != 0) + if (setsockopt_int(rcvsock, SOL_V6_OPTION, IPV6_CHECKSUM, 2) != 0) bb_perror_msg_and_die("setsockopt(%s)", "IPV6_CHECKSUM"); if (op & OPT_USE_ICMP) snd = xsocket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6);