mirror of
https://passt.top/passt
synced 2024-07-05 01:12:41 +00:00
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
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;
|
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
|
* tcp_splice_conn_from_sock() - Attempt to init state for a spliced connection
|
||||||
* @c: Execution context
|
* @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,
|
union tcp_listen_epoll_ref ref, union flow *flow,
|
||||||
int s0, const union sockaddr_inany *sa)
|
int s0, const union sockaddr_inany *sa)
|
||||||
{
|
{
|
||||||
|
in_port_t srcport, dstport = ref.port;
|
||||||
struct tcp_splice_conn *conn;
|
struct tcp_splice_conn *conn;
|
||||||
union inany_addr src;
|
union inany_addr src;
|
||||||
in_port_t srcport;
|
sa_family_t af;
|
||||||
|
int s1;
|
||||||
|
|
||||||
ASSERT(c->mode == MODE_PASTA);
|
ASSERT(c->mode == MODE_PASTA);
|
||||||
|
|
||||||
@ -453,9 +424,11 @@ bool tcp_splice_conn_from_sock(const struct ctx *c,
|
|||||||
if (!inany_is_loopback(&src))
|
if (!inany_is_loopback(&src))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
af = inany_v4(&src) ? AF_INET : AF_INET6;
|
||||||
|
|
||||||
conn = FLOW_START(flow, FLOW_TCP_SPLICE, tcp_splice, 0);
|
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[0] = s0;
|
||||||
conn->s[1] = -1;
|
conn->s[1] = -1;
|
||||||
conn->pipe[0][0] = conn->pipe[0][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)))
|
if (setsockopt(s0, SOL_TCP, TCP_QUICKACK, &((int){ 1 }), sizeof(int)))
|
||||||
flow_trace(conn, "failed to set TCP_QUICKACK on %i", s0);
|
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);
|
conn_flag(c, conn, CLOSING);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
Loading…
Reference in New Issue
Block a user