int
Ip::Qos::setSockTos(const Comm::ConnectionPointer &conn, tos_t tos)
{
-#ifdef IP_TOS
+#if defined(IP_TOS)
+ // Bug 3731: FreeBSD produces 'invalid option'
+ // unless we pass it a 32-bit variable storing 8-bits of data.
+#if _SQUID_FREEBSD_
+ int32_t bTos = tos;
+ int x = setsockopt(conn->fd, IPPROTO_IP, IP_TOS, &bTos, sizeof(bTos));
+#else
int x = setsockopt(conn->fd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos_t));
+#endif
if (x < 0)
debugs(50, 2, "Ip::Qos::setSockTos: setsockopt(IP_TOS) on " << conn << ": " << xstrerror());
return x;