Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/RMerl/asuswrt-merlin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladislav Grishenko <themiron@mail.ru>2016-12-10 17:22:25 +0300
committerVladislav Grishenko <themiron@mail.ru>2016-12-10 17:27:56 +0300
commit0aed77d977d91f0ce06d3c41b0943857a136422d (patch)
treea4defd0d158d3869e3b91a8bc6c003b43c0c4235
parent64630e030574b5d864727dbd557fb26a83557181 (diff)
busybox: libbb: add workaround for IPV6_2292PKTINFO and fix recv_from_to() IPv6 scope
-rw-r--r--release/src/router/busybox/libbb/udp_io.c16
-rw-r--r--release/src/router/busybox/networking/traceroute.c7
2 files changed, 15 insertions, 8 deletions
diff --git a/release/src/router/busybox/libbb/udp_io.c b/release/src/router/busybox/libbb/udp_io.c
index a32af9bd20..8d1c9333c5 100644
--- a/release/src/router/busybox/libbb/udp_io.c
+++ b/release/src/router/busybox/libbb/udp_io.c
@@ -19,7 +19,14 @@ socket_want_pktinfo(int fd UNUSED_PARAM)
setsockopt_1(fd, IPPROTO_IP, IP_PKTINFO);
#endif
#if ENABLE_FEATURE_IPV6 && defined(IPV6_PKTINFO)
+# ifdef IPV6_RECVPKTINFO
+ setsockopt_1(fd, SOL_IPV6, IPV6_RECVPKTINFO);
+# ifdef IPV6_2292PKTINFO
+ setsockopt_1(fd, SOL_IPV6, IPV6_2292PKTINFO);
+# endif
+# else
setsockopt_1(fd, IPPROTO_IPV6, IPV6_PKTINFO);
+# endif
#endif
}
@@ -162,14 +169,19 @@ recv_from_to(int fd, void *buf, size_t len, int flags,
}
# if ENABLE_FEATURE_IPV6 && defined(IPV6_PKTINFO)
if (cmsgptr->cmsg_level == IPPROTO_IPV6
- && cmsgptr->cmsg_type == IPV6_PKTINFO
- ) {
+ && (cmsgptr->cmsg_type == IPV6_PKTINFO
+# if defined(IPV6_RECVPKTINFO) && defined(IPV6_2292PKTINFO)
+ || cmsgptr->cmsg_type == IPV6_2292PKTINFO
+# endif
+ )) {
const int IPI6_ADDR_OFF = offsetof(struct in6_pktinfo, ipi6_addr);
+ const int IPI6_IFINDEX_OFF = offsetof(struct in6_pktinfo, ipi6_ifindex);
to->sa_family = AF_INET6;
/*# define pktinfo(cmsgptr) ( (struct in6_pktinfo*)(CMSG_DATA(cmsgptr)) )*/
/*to6->sin6_addr = pktinfo(cmsgptr)->ipi6_addr; - may be unaligned */
memcpy(&to6->sin6_addr, (char*)(CMSG_DATA(cmsgptr)) + IPI6_ADDR_OFF, sizeof(to6->sin6_addr));
/*to6->sin6_port = 123; */
+ move_from_unaligned_int(to6->sin6_scope_id, (char*)(CMSG_DATA(cmsgptr)) + IPI6_IFINDEX_OFF);
break;
}
# endif
diff --git a/release/src/router/busybox/networking/traceroute.c b/release/src/router/busybox/networking/traceroute.c
index eee4f8873a..b98aed3b49 100644
--- a/release/src/router/busybox/networking/traceroute.c
+++ b/release/src/router/busybox/networking/traceroute.c
@@ -901,12 +901,7 @@ common_traceroute_main(int op, char **argv)
#if ENABLE_TRACEROUTE6
if (af == AF_INET6) {
xmove_fd(xsocket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6), rcvsock);
-# ifdef IPV6_RECVPKTINFO
- setsockopt_1(rcvsock, SOL_IPV6, IPV6_RECVPKTINFO);
- setsockopt_1(rcvsock, SOL_IPV6, IPV6_2292PKTINFO);
-# else
- setsockopt_1(rcvsock, SOL_IPV6, IPV6_PKTINFO);
-# endif
+ socket_want_pktinfo(rcvsock);
} else
#endif
{