if (!sockaddr_alloc(&conn->src, NULL, 0))
return 0;
- if (conn->ctrl->fam->get_src(conn->handle.fd, (struct sockaddr *)conn->src,
+ if (conn->ctrl->fam->get_src && !(conn->flags & CO_FL_FDLESS) &&
+ conn->ctrl->fam->get_src(conn->handle.fd, (struct sockaddr *)conn->src,
sizeof(*conn->src),
obj_type(conn->target) != OBJ_TYPE_LISTENER) == -1)
return 0;
if (!sockaddr_alloc(&conn->dst, NULL, 0))
return 0;
- if (conn->ctrl->fam->get_dst(conn->handle.fd, (struct sockaddr *)conn->dst,
+ if (conn->ctrl->fam->get_dst && !(conn->flags & CO_FL_FDLESS) &&
+ conn->ctrl->fam->get_dst(conn->handle.fd, (struct sockaddr *)conn->dst,
sizeof(*conn->dst),
obj_type(conn->target) != OBJ_TYPE_LISTENER) == -1)
return 0;
*/
static inline void conn_set_tos(const struct connection *conn, int tos)
{
- if (!conn || !conn_ctrl_ready(conn))
+ if (!conn || !conn_ctrl_ready(conn) || (conn->flags & CO_FL_FDLESS))
return;
#ifdef IP_TOS
*/
static inline void conn_set_mark(const struct connection *conn, int mark)
{
- if (!conn || !conn_ctrl_ready(conn))
+ if (!conn || !conn_ctrl_ready(conn) || (conn->flags & CO_FL_FDLESS))
return;
#if defined(SO_MARK)
*/
static inline void conn_set_quickack(const struct connection *conn, int value)
{
- if (!conn || !conn_ctrl_ready(conn))
+ if (!conn || !conn_ctrl_ready(conn) || (conn->flags & CO_FL_FDLESS))
return;
#ifdef TCP_QUICKACK
if (strm)
strm->csf->si->flags |= SI_FL_NOLINGER;
+ if (conn->flags & CO_FL_FDLESS)
+ goto out;
+
/* We're on the client-facing side, we must force to disable lingering to
* ensure we will use an RST exclusively and kill any pending data.
*/
/* The fd may not be available for the tcp_info struct, and the
syscal can fail. */
optlen = sizeof(info);
- if (getsockopt(conn->handle.fd, IPPROTO_TCP, TCP_INFO, &info, &optlen) == -1)
+ if ((conn->flags & CO_FL_FDLESS) ||
+ getsockopt(conn->handle.fd, IPPROTO_TCP, TCP_INFO, &info, &optlen) == -1)
return 0;
/* extract the value. */
ssl_sock_set_alpn(conn, (unsigned char *)s->check.alpn_str, s->check.alpn_len);
#endif
- if (conn_ctrl_ready(conn) && (connect->options & TCPCHK_OPT_LINGER)) {
+ if (conn_ctrl_ready(conn) && (connect->options & TCPCHK_OPT_LINGER) && !(conn->flags & CO_FL_FDLESS)) {
/* Some servers don't like reset on close */
HA_ATOMIC_AND(&fdtab[conn->handle.fd].state, ~FD_LINGER_RISK);
}