]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Bug 3887: tcp_outgoing_tos not working for IPv6
authorAmos Jeffries <squid3@treenet.co.nz>
Sun, 3 Nov 2013 08:35:21 +0000 (01:35 -0700)
committerAmos Jeffries <squid3@treenet.co.nz>
Sun, 3 Nov 2013 08:35:21 +0000 (01:35 -0700)
src/ip/Qos.cci

index 97a5918a4035242780d05a2b901614297db404b9..5e31caed93bc8650fc549834c7535d04bc758830 100644 (file)
@@ -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