return (time_t)ctimeout;
}
+/// called when serverConn is set to an _open_ to-peer connection
+void
+FwdState::syncWithServerConn(const char *host)
+{
+ if (Ip::Qos::TheConfig.isAclTosActive())
+ Ip::Qos::setSockTos(serverConn, GetTosToServer(request));
+
+#if SO_MARK
+ if (Ip::Qos::TheConfig.isAclNfmarkActive())
+ Ip::Qos::setSockNfmark(serverConn, GetNfmarkToServer(request));
+#endif
+
+ request->hier.note(serverConn, host);
+}
+
/**
* Called after forwarding path selection (via peer select) has taken place
* and whenever forwarding needs to attempt a new connection (routing failover).
flags.connected_okay = true;
++n_tries;
request->flags.pinned = true;
- request->hier.note(serverConn, pinned_connection->pinning.host);
if (pinned_connection->pinnedAuth())
request->flags.auth = true;
comm_add_close_handler(serverConn->fd, fwdServerClosedWrapper, this);
- /* Update server side TOS and Netfilter mark on the connection. */
- if (Ip::Qos::TheConfig.isAclTosActive()) {
- debugs(17, 3, HERE << "setting tos for pinned connection to " << (int)serverConn->tos );
- serverConn->tos = GetTosToServer(request);
- Ip::Qos::setSockTos(serverConn, serverConn->tos);
- }
-#if SO_MARK
- if (Ip::Qos::TheConfig.isAclNfmarkActive()) {
- serverConn->nfmark = GetNfmarkToServer(request);
- Ip::Qos::setSockNfmark(serverConn, serverConn->nfmark);
- }
-#endif
+ syncWithServerConn(pinned_connection->pinning.host);
// the server may close the pinned connection before this request
pconnRace = racePossible;
comm_add_close_handler(serverConnection()->fd, fwdServerClosedWrapper, this);
- /* Update server side TOS and Netfilter mark on the connection. */
- if (Ip::Qos::TheConfig.isAclTosActive()) {
- const tos_t tos = GetTosToServer(request);
- Ip::Qos::setSockTos(temp, tos);
- }
-#if SO_MARK
- if (Ip::Qos::TheConfig.isAclNfmarkActive()) {
- const nfmark_t nfmark = GetNfmarkToServer(request);
- Ip::Qos::setSockNfmark(temp, nfmark);
- }
-#endif
+ syncWithServerConn(request->url.host());
dispatch();
return;
// Set TOS if needed.
// To correctly implement TOS values on listening sockets, probably requires
// more work to inherit TOS values to created connection objects.
- if (conn->tos &&
- Ip::Qos::setSockTos(conn->fd, conn->tos, conn->remote.isIPv4() ? AF_INET : AF_INET6) < 0)
- conn->tos = 0;
+ if (conn->tos)
+ Ip::Qos::setSockTos(conn, conn->tos)
#if SO_MARK
- if (conn->nfmark &&
- Ip::Qos::setSockNfmark(conn->fd, conn->nfmark) < 0)
- conn->nfmark = 0;
+ if (conn->nfmark)
+ Ip::Qos::setSockNfmark(conn, conn->nfmark);
#endif
#endif
// so we convert to a int before setting.
int bTos = tos;
+ debugs(50, 3, "for FD " << fd << " to " << bTos);
+
if (type == AF_INET) {
#if defined(IP_TOS)
const int x = setsockopt(fd, IPPROTO_IP, IP_TOS, &bTos, sizeof(bTos));
Ip::Qos::setSockTos(const Comm::ConnectionPointer &conn, tos_t tos)
{
const int x = Ip::Qos::setSockTos(conn->fd, tos, conn->remote.isIPv4() ? AF_INET : AF_INET6);
- if (x >= 0)
- conn->tos = tos;
-
+ conn->tos = (x >= 0) ? tos : 0;
return x;
}
Ip::Qos::setSockNfmark(const int fd, nfmark_t mark)
{
#if SO_MARK && USE_LIBCAP
+ debugs(50, 3, "for FD " << fd << " to " << mark);
const int x = setsockopt(fd, SOL_SOCKET, SO_MARK, &mark, sizeof(nfmark_t));
if (x < 0)
debugs(50, 2, "setSockNfmark: setsockopt(SO_MARK) on " << fd << ": " << xstrerror());
Ip::Qos::setSockNfmark(const Comm::ConnectionPointer &conn, nfmark_t mark)
{
const int x = Ip::Qos::setSockNfmark(conn->fd, mark);
- if (x >= 0)
- conn->nfmark = mark;
+ conn->nfmark = (x >= 0) ? mark : 0;
return x;
}