]>
Commit | Line | Data |
---|---|---|
055421ee | 1 | /* |
f6e9a3ee | 2 | * Copyright (C) 1996-2019 The Squid Software Foundation and contributors |
055421ee | 3 | * |
bbc27441 AJ |
4 | * Squid software is distributed under GPLv2+ license and includes |
5 | * contributions from numerous individuals and organizations. | |
6 | * Please see the COPYING and CONTRIBUTORS files for details. | |
055421ee AJ |
7 | */ |
8 | ||
bbc27441 AJ |
9 | /* DEBUG: section 21 Misc Functions */ |
10 | ||
f7f3304a | 11 | #include "squid.h" |
055421ee | 12 | #include "Debug.h" |
4685e7ba | 13 | #include "ip/Address.h" |
055421ee AJ |
14 | #include "ip/tools.h" |
15 | ||
60d08fa6 AJ |
16 | #if HAVE_UNISTD_H |
17 | #include <unistd.h> | |
18 | #endif | |
055421ee AJ |
19 | #if HAVE_SYS_SOCKET_H |
20 | #include <sys/socket.h> | |
21 | #endif | |
22 | #if HAVE_NETINET_IN_H | |
23 | #include <netinet/in.h> | |
24 | #endif | |
25 | #if HAVE_NETINET_IN6_H | |
26 | #include <netinet/in6.h> | |
27 | #endif | |
28 | ||
29 | int Ip::EnableIpv6 = IPV6_OFF; | |
30 | ||
31 | void | |
32 | Ip::ProbeTransport() | |
33 | { | |
055421ee AJ |
34 | // check for usable IPv6 sockets |
35 | int s = socket(PF_INET6, SOCK_STREAM, 0); | |
36 | if (s < 0) { | |
37 | debugs(3, 2, "IPv6 not supported on this machine. Auto-Disabled."); | |
38 | EnableIpv6 = IPV6_OFF; | |
39 | return; | |
40 | } | |
41 | ||
42 | // Test for v4-mapping capability | |
ca44fd48 AJ |
43 | // (AKA. the operating system supports RFC 3493 section 5.3) |
44 | #if defined(IPV6_V6ONLY) | |
055421ee | 45 | int tos = 0; |
6df7ad56 | 46 | if (setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, (char *) &tos, sizeof(int)) == 0) { |
055421ee AJ |
47 | debugs(3, 2, "Detected IPv6 hybrid or v4-mapping stack..."); |
48 | EnableIpv6 |= IPV6_SPECIAL_V4MAPPING; | |
49 | } else { | |
50 | debugs(3, 2, "Detected split IPv4 and IPv6 stacks ..."); | |
e0209dae | 51 | EnableIpv6 |= IPV6_SPECIAL_SPLITSTACK; |
055421ee | 52 | } |
ca44fd48 AJ |
53 | #else |
54 | // compliance here means they at least supply the option for compilers building code | |
55 | // even if possibly to return hard-coded -1 on use. | |
56 | debugs(3, 2, "Missing RFC 3493 compliance - attempting split IPv4 and IPv6 stacks ..."); | |
57 | EnableIpv6 |= IPV6_SPECIAL_SPLITSTACK; | |
58 | #endif | |
4685e7ba AJ |
59 | |
60 | // Test for IPv6 loopback/localhost address binding | |
61 | Ip::Address ip; | |
62 | ip.setLocalhost(); | |
63 | if (ip.isIPv6()) { // paranoid; always succeeds if we got this far | |
64 | struct sockaddr_in6 sin; | |
65 | ip.getSockAddr(sin); | |
66 | if (bind(s, reinterpret_cast<struct sockaddr *>(&sin), sizeof(sin)) != 0) { | |
67 | debugs(3, DBG_CRITICAL, "WARNING: BCP 177 violation. Detected non-functional IPv6 loopback."); | |
68 | EnableIpv6 = IPV6_OFF; | |
69 | } else { | |
70 | debugs(3, 2, "Detected functional IPv6 loopback ..."); | |
71 | } | |
72 | } | |
73 | ||
055421ee AJ |
74 | close(s); |
75 | ||
041c8f46 | 76 | #if USE_IPV6 |
055421ee AJ |
77 | debugs(3, 2, "IPv6 transport " << (EnableIpv6?"Enabled":"Disabled")); |
78 | #else | |
041c8f46 AJ |
79 | debugs(3, 2, "IPv6 transport " << (EnableIpv6?"Available":"Disabled")); |
80 | if (EnableIpv6 != IPV6_OFF) { | |
81 | debugs(3, DBG_CRITICAL, "WARNING: BCP 177 violation. IPv6 transport forced OFF by build parameters."); | |
82 | EnableIpv6 = IPV6_OFF; | |
83 | } | |
055421ee AJ |
84 | #endif |
85 | } | |
f53969cc | 86 |