From: Amos Jeffries Date: Sun, 1 Aug 2010 06:16:06 +0000 (+1200) Subject: Basic split-stack functionality X-Git-Tag: take1~431 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e0209daead16f26629c7e3b568d2251cec66d8e1;p=thirdparty%2Fsquid.git Basic split-stack functionality Enable split-stack detection by default. There is now enough split-stack support to enable accepting IPv6 client connections on systems with separate IPv4/IPv6 stacks. Also some limited server connection capabilities (see tcp_outgoing_addr config hacks). SNMP, ICP, HTCP listeners and outbound connections currently default to IPv4-only on these systems to retain backward-compatibility. But may be explicity configured to IPv6-only. There is no support as yet for dual-protocol behaviour in the sockets of these three protocols. --- diff --git a/src/htcp.cc b/src/htcp.cc index 71f4275269..88cbe91d91 100644 --- a/src/htcp.cc +++ b/src/htcp.cc @@ -1508,6 +1508,10 @@ htcpInit(void) debugs(31, DBG_CRITICAL, "ERROR: IPv6 is disabled. " << incomingAddr << " is not an IPv4 address."); fatal("HTCP port cannot be opened."); } + /* split-stack for now requires default IPv4-only HTCP */ + if (Ip::EnableIpv6&IPV6_SPECIAL_SPLITSTACK && incomingAddr.IsAnyAddr()) { + incomingAddr.SetIPv4(); + } AsyncCall::Pointer call = asyncCall(31, 2, "htcpIncomingConnectionOpened", @@ -1527,6 +1531,11 @@ htcpInit(void) debugs(31, DBG_CRITICAL, "ERROR: IPv6 is disabled. " << outgoingAddr << " is not an IPv4 address."); fatal("HTCP port cannot be opened."); } + /* split-stack for now requires default IPv4-only HTCP */ + if (Ip::EnableIpv6&IPV6_SPECIAL_SPLITSTACK && outgoingAddr.IsAnyAddr()) { + outgoingAddr.SetIPv4(); + } + enter_suid(); htcpOutSocket = comm_open_listener(SOCK_DGRAM, IPPROTO_UDP, diff --git a/src/icp_v2.cc b/src/icp_v2.cc index 781831e623..284e3abe3b 100644 --- a/src/icp_v2.cc +++ b/src/icp_v2.cc @@ -691,6 +691,10 @@ icpConnectionsOpen(void) debugs(12, DBG_CRITICAL, "ERROR: IPv6 is disabled. " << addr << " is not an IPv4 address."); fatal("ICP port cannot be opened."); } + /* split-stack for now requires default IPv4-only ICP */ + if (Ip::EnableIpv6&IPV6_SPECIAL_SPLITSTACK && addr.IsAnyAddr()) { + addr.SetIPv4(); + } AsyncCall::Pointer call = asyncCall(12, 2, "icpIncomingConnectionOpened", @@ -712,6 +716,10 @@ icpConnectionsOpen(void) debugs(49, DBG_CRITICAL, "ERROR: IPv6 is disabled. " << addr << " is not an IPv4 address."); fatal("ICP port cannot be opened."); } + /* split-stack for now requires default IPv4-only ICP */ + if (Ip::EnableIpv6&IPV6_SPECIAL_SPLITSTACK && addr.IsAnyAddr()) { + addr.SetIPv4(); + } theOutIcpConnection = comm_open_listener(SOCK_DGRAM, IPPROTO_UDP, diff --git a/src/ip/tools.cc b/src/ip/tools.cc index 20a6c16281..d8ddf51efe 100644 --- a/src/ip/tools.cc +++ b/src/ip/tools.cc @@ -31,8 +31,6 @@ */ #include "config.h" -//#include "compat/getaddrinfo.h" -//#include "compat/getnameinfo.h" #include "Debug.h" #include "ip/tools.h" @@ -67,9 +65,7 @@ Ip::ProbeTransport() EnableIpv6 |= IPV6_SPECIAL_V4MAPPING; } else { debugs(3, 2, "Detected split IPv4 and IPv6 stacks ..."); - // EnableIpv6 |= IPV6_SPECIAL_SPLITSTACK; - // TODO: remove death when split-stack is supported. - EnableIpv6 = IPV6_OFF; + EnableIpv6 |= IPV6_SPECIAL_SPLITSTACK; } close(s); diff --git a/src/snmp_core.cc b/src/snmp_core.cc index 57a93a1ee5..25d4d80a1c 100644 --- a/src/snmp_core.cc +++ b/src/snmp_core.cc @@ -34,7 +34,6 @@ #include "cache_snmp.h" #include "comm.h" #include "ipc/StartListening.h" -//#include "compat/strsep.h" #include "ip/Address.h" #include "ip/tools.h" @@ -311,6 +310,11 @@ snmpConnectionOpen(void) debugs(49, DBG_CRITICAL, "ERROR: IPv6 is disabled. " << Config.Addrs.snmp_incoming << " is not an IPv4 address."); fatal("SNMP port cannot be opened."); } + /* split-stack for now requires IPv4-only SNMP */ + if (Ip::EnableIpv6&IPV6_SPECIAL_SPLITSTACK && Config.Addrs.snmp_incoming.IsAnyAddr()) { + Config.Addrs.snmp_incoming.SetIPv4(); + } + AsyncCall::Pointer call = asyncCall(49, 2, "snmpIncomingConnectionOpened", SnmpListeningStartedDialer(&snmpIncomingConnectionOpened)); @@ -328,6 +332,10 @@ snmpConnectionOpen(void) debugs(49, DBG_CRITICAL, "ERROR: IPv6 is disabled. " << Config.Addrs.snmp_outgoing << " is not an IPv4 address."); fatal("SNMP port cannot be opened."); } + /* split-stack for now requires IPv4-only SNMP */ + if (Ip::EnableIpv6&IPV6_SPECIAL_SPLITSTACK && Config.Addrs.snmp_outgoing.IsAnyAddr()) { + Config.Addrs.snmp_outgoing.SetIPv4(); + } AsyncCall::Pointer call = asyncCall(49, 2, "snmpOutgoingConnectionOpened", SnmpListeningStartedDialer(&snmpOutgoingConnectionOpened));