From: Amos Jeffries Date: Sun, 3 Nov 2013 08:35:21 +0000 (-0700) Subject: Bug 3887: tcp_outgoing_tos not working for IPv6 X-Git-Tag: SQUID_3_3_10~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=15cd5264f622f54df1e28ee236a611d156320a2f;p=thirdparty%2Fsquid.git Bug 3887: tcp_outgoing_tos not working for IPv6 --- diff --git a/src/ip/Qos.cci b/src/ip/Qos.cci index 97a5918a40..5e31caed93 100644 --- a/src/ip/Qos.cci +++ b/src/ip/Qos.cci @@ -5,20 +5,40 @@ int Ip::Qos::setSockTos(const Comm::ConnectionPointer &conn, tos_t tos) { -#if defined(IP_TOS) // Bug 3731: FreeBSD produces 'invalid option' // unless we pass it a 32-bit variable storing 8-bits of data. // NP: it is documented as 'int' for all systems, even those like Linux which accept 8-bit char // so we convert to a int before setting. int bTos = tos; - int x = setsockopt(conn->fd, IPPROTO_IP, IP_TOS, &bTos, sizeof(bTos)); - if (x < 0) - debugs(50, 2, "Ip::Qos::setSockTos: setsockopt(IP_TOS) on " << conn << ": " << xstrerror()); - return x; + + if (conn->remote.IsIPv4()) { +#if defined(IP_TOS) + int x = setsockopt(conn->fd, IPPROTO_IP, IP_TOS, &bTos, sizeof(bTos)); + if (x < 0) + debugs(50, 2, "Ip::Qos::setSockTos: setsockopt(IP_TOS) on " << conn << ": " << xstrerror()); + else + conn->tos = tos; + return x; #else - debugs(50, DBG_IMPORTANT, "WARNING: setsockopt(IP_TOS) not supported on this platform"); - return -1; + debugs(50, DBG_IMPORTANT, "WARNING: setsockopt(IP_TOS) not supported on this platform"); + return -1; #endif + + } else { // if (conn->remote.IsIPv6()) { +#if defined(IPV6_TCLASS) + int x = setsockopt(conn->fd, IPPROTO_IPV6, IPV6_TCLASS, &bTos, sizeof(bTos)); + if (x < 0) + debugs(50, 2, "Ip::Qos::setSockTos: setsockopt(IPV6_TCLASS) on " << conn << ": " << xstrerror()); + else + conn->tos = tos; + return x; +#else + debugs(50, DBG_IMPORTANT, "WARNING: setsockopt(IPV6_TCLASS) not supported on this platform"); + return -1; +#endif + } + + /* CANNOT REACH HERE */ } int