tcp_splice: Merge tcp_splice_new() into its caller

The only caller of tcp_splice_new() is tcp_splice_conn_from_sock().
Both are quite short, and the division of responsibilities between the
two isn't particularly obvious.  Simplify by merging the former into
the latter.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
David Gibson 2024-02-28 22:25:12 +11:00 committed by Stefano Brivio
parent 04d3d02603
commit f4e5d73684

View file

@ -397,37 +397,6 @@ static int tcp_conn_sock_ns(const struct ctx *c, sa_family_t af)
return -1;
}
/**
* tcp_splice_new() - Handle new spliced connection
* @c: Execution context
* @conn: Connection pointer
* @port: Destination port, host order
* @pif: Originating pif of the splice
*
* Return: return code from connect()
*/
static int tcp_splice_new(const struct ctx *c, struct tcp_splice_conn *conn,
in_port_t dstport, uint8_t pif)
{
sa_family_t af = CONN_V6(conn) ? AF_INET6 : AF_INET;
int s1;
if (pif == PIF_SPLICE) {
dstport += c->tcp.fwd_out.delta[dstport];
s1 = tcp_conn_sock(c, af);
} else {
ASSERT(pif == PIF_HOST);
dstport += c->tcp.fwd_in.delta[dstport];
s1 = tcp_conn_sock_ns(c, af);
}
if (s1 < 0)
return s1;
return tcp_splice_connect(c, conn, s1, dstport);
}
/**
* tcp_splice_conn_from_sock() - Attempt to init state for a spliced connection
* @c: Execution context
@ -443,9 +412,11 @@ bool tcp_splice_conn_from_sock(const struct ctx *c,
union tcp_listen_epoll_ref ref, union flow *flow,
int s0, const union sockaddr_inany *sa)
{
in_port_t srcport, dstport = ref.port;
struct tcp_splice_conn *conn;
union inany_addr src;
in_port_t srcport;
sa_family_t af;
int s1;
ASSERT(c->mode == MODE_PASTA);
@ -453,9 +424,11 @@ bool tcp_splice_conn_from_sock(const struct ctx *c,
if (!inany_is_loopback(&src))
return false;
af = inany_v4(&src) ? AF_INET : AF_INET6;
conn = FLOW_START(flow, FLOW_TCP_SPLICE, tcp_splice, 0);
conn->flags = inany_v4(&src) ? 0 : SPLICE_V6;
conn->flags = af == AF_INET ? 0 : SPLICE_V6;
conn->s[0] = s0;
conn->s[1] = -1;
conn->pipe[0][0] = conn->pipe[0][1] = -1;
@ -464,7 +437,24 @@ bool tcp_splice_conn_from_sock(const struct ctx *c,
if (setsockopt(s0, SOL_TCP, TCP_QUICKACK, &((int){ 1 }), sizeof(int)))
flow_trace(conn, "failed to set TCP_QUICKACK on %i", s0);
if (tcp_splice_new(c, conn, ref.port, ref.pif))
if (ref.pif == PIF_SPLICE) {
dstport += c->tcp.fwd_out.delta[dstport];
s1 = tcp_conn_sock(c, af);
} else {
ASSERT(ref.pif == PIF_HOST);
dstport += c->tcp.fwd_in.delta[dstport];
s1 = tcp_conn_sock_ns(c, af);
}
if (s1 < 0) {
conn_flag(c, conn, CLOSING);
return true;
}
if (tcp_splice_connect(c, conn, s1, dstport))
conn_flag(c, conn, CLOSING);
return true;