19#include <netinet/in.h>
22#include <netinet/in6.h>
31 auto s =
xsocket(PF_INET6, SOCK_STREAM, 0);
33 debugs(3, 2,
"IPv6 not supported on this machine. Auto-Disabled.");
40#if defined(IPV6_V6ONLY)
42 if (
xsetsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, &tos,
sizeof(
int)) == 0) {
43 debugs(3, 2,
"Detected IPv6 hybrid or v4-mapping stack...");
46 debugs(3, 2,
"Detected split IPv4 and IPv6 stacks ...");
52 debugs(3, 2,
"Missing RFC 3493 compliance - attempting split IPv4 and IPv6 stacks ...");
60 struct sockaddr_in6 sin;
62 if (
xbind(s,
reinterpret_cast<struct sockaddr *
>(&sin),
sizeof(sin)) != 0) {
63 debugs(3,
Critical(66),
"WARNING: BCP 177 violation. Detected non-functional IPv6 loopback.");
66 debugs(3, 2,
"Detected functional IPv6 loopback ...");
73 debugs(3, 2,
"IPv6 transport " << (EnableIpv6?
"Enabled":
"Disabled"));
75 debugs(3, 2,
"IPv6 transport " << (EnableIpv6?
"Available":
"Disabled"));
77 debugs(3,
Critical(67),
"WARNING: BCP 177 violation. IPv6 transport forced OFF by build parameters.");
void getSockAddr(struct sockaddr_storage &addr, const int family) const
#define debugs(SECTION, LEVEL, CONTENT)
void ProbeTransport(void)
Probe to discover IPv6 capabilities.
int xsocket(int domain, int type, int protocol)
POSIX socket(2) equivalent.
int xbind(int socketFd, const struct sockaddr *sa, socklen_t saLength)
POSIX bind(2) equivalent.
int xsetsockopt(int socketFd, int level, int option, const void *value, socklen_t valueLength)
POSIX setsockopt(2) equivalent.
int EnableIpv6
Whether IPv6 is supported and type of support.
int xclose(int fd)
POSIX close(2) equivalent.