diff options
author | Vladislav Grishenko <themiron@mail.ru> | 2016-12-10 17:22:25 +0300 |
---|---|---|
committer | Vladislav Grishenko <themiron@mail.ru> | 2016-12-10 17:27:56 +0300 |
commit | 0aed77d977d91f0ce06d3c41b0943857a136422d (patch) | |
tree | a4defd0d158d3869e3b91a8bc6c003b43c0c4235 | |
parent | 64630e030574b5d864727dbd557fb26a83557181 (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.c | 16 | ||||
-rw-r--r-- | release/src/router/busybox/networking/traceroute.c | 7 |
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 { |