create_udp_sock(struct addrinfo *addr, int v6only)
{
int s;
-# if defined(IPV6_V6ONLY)
+# if defined(IPV6_USE_MIN_MTU)
int on=1;
# else
(void)v6only;
if(addr->ai_family == AF_INET6) {
# if defined(IPV6_V6ONLY)
if(v6only) {
+ int val=(v6only==2)?0:1;
if (setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY,
- &on, (socklen_t)sizeof(on)) < 0) {
+ &val, (socklen_t)sizeof(val)) < 0) {
log_err("setsockopt(..., IPV6_V6ONLY"
", ...) failed: %s", strerror(errno));
return -1;
strerror(errno));
return 0;
}
-#ifdef IPV6_V6ONLY
- on = 0;
- if(setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY,
- &on, (socklen_t)sizeof(on)) < 0) {
- log_err("disable sockopt(..., IPV6_V6ONLY, ...) failed: %s"
- " (on BSD may be due to net.inet6.ip6.v6only sysctl)",
- strerror(errno));
- return 0;
- }
-#endif /* defined IPV6_V6ONLY */
return 1;
}
#endif /* defined IPV6_RECVPKTINFO */
if(do_auto) {
/* skip ip4 sockets, ip4 udp gets mapped to v6 */
if(hints->ai_family == AF_INET6) {
- if((s = make_sock(SOCK_DGRAM, ifname, port, hints, 0))
+ if((s = make_sock(SOCK_DGRAM, ifname, port, hints, 2))
== -1)
return 0;
#ifdef IPV6_RECVPKTINFO
* Create and bind nonblocking UDP socket
* @param addr: address info ready to make socket.
* @param v6only: if enabled, IP6 sockets get IP6ONLY option set.
+ * if enabled with value 2 IP6ONLY option is disabled.
* @return: the socket. -1 on error.
*/
int create_udp_sock(struct addrinfo* addr, int v6only);