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 <s...@os2.kiev.ua>
---
 networking/traceroute.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/networking/traceroute.c b/networking/traceroute.c
index bd63e4449..7cba9d2f1 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
+#ifdef __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);
-- 
2.29.1

_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to