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:
parent
04d3d02603
commit
f4e5d73684
1 changed files with 24 additions and 34 deletions
58
tcp_splice.c
58
tcp_splice.c
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue