diff --git a/tcp.c b/tcp.c index be62a31..b4d7eec 100644 --- a/tcp.c +++ b/tcp.c @@ -2679,14 +2679,13 @@ static void tcp_snat_inbound(const struct ctx *c, union inany_addr *addr) /** * tcp_tap_conn_from_sock() - Initialize state for non-spliced connection * @c: Execution context - * @ref: epoll reference of listening socket + * @dstport: Destination port for connection (host side) * @flow: flow to initialise * @s: Accepted socket * @sa: Peer socket address (from accept()) * @now: Current timestamp */ -static void tcp_tap_conn_from_sock(struct ctx *c, - union tcp_listen_epoll_ref ref, +static void tcp_tap_conn_from_sock(struct ctx *c, in_port_t dstport, union flow *flow, int s, const union sockaddr_inany *sa, const struct timespec *now) @@ -2699,7 +2698,7 @@ static void tcp_tap_conn_from_sock(struct ctx *c, conn_event(c, conn, SOCK_ACCEPTED); inany_from_sockaddr(&conn->faddr, &conn->fport, sa); - conn->eport = ref.port + c->tcp.fwd_in.delta[ref.port]; + conn->eport = dstport + c->tcp.fwd_in.delta[dstport]; tcp_snat_inbound(c, &conn->faddr); @@ -2737,10 +2736,11 @@ void tcp_listen_handler(struct ctx *c, union epoll_ref ref, if (s < 0) goto cancel; - if (tcp_splice_conn_from_sock(c, ref.tcp_listen, flow, s, &sa)) + if (tcp_splice_conn_from_sock(c, ref.tcp_listen.pif, + ref.tcp_listen.port, flow, s, &sa)) return; - tcp_tap_conn_from_sock(c, ref.tcp_listen, flow, s, &sa, now); + tcp_tap_conn_from_sock(c, ref.tcp_listen.port, flow, s, &sa, now); return; cancel: diff --git a/tcp_splice.c b/tcp_splice.c index 45b9b29..4957abb 100644 --- a/tcp_splice.c +++ b/tcp_splice.c @@ -413,7 +413,8 @@ static int tcp_conn_sock_ns(const struct ctx *c, sa_family_t af) /** * tcp_splice_conn_from_sock() - Attempt to init state for a spliced connection * @c: Execution context - * @ref: epoll reference of listening socket + * @pif0: pif id of side 0 + * @dstport: Side 0 destination port of connection * @flow: flow to initialise * @s0: Accepted (side 0) socket * @sa: Peer address of connection @@ -422,12 +423,13 @@ static int tcp_conn_sock_ns(const struct ctx *c, sa_family_t af) * #syscalls:pasta setsockopt */ 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) + uint8_t pif0, in_port_t dstport, + 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; uint8_t pif1; @@ -437,7 +439,7 @@ bool tcp_splice_conn_from_sock(const struct ctx *c, inany_from_sockaddr(&src, &srcport, sa); af = inany_v4(&src) ? AF_INET : AF_INET6; - switch (ref.pif) { + switch (pif0) { case PIF_SPLICE: if (!inany_is_loopback(&src)) { char str[INANY_ADDRSTRLEN]; diff --git a/tcp_splice.h b/tcp_splice.h index d0c6ff7..ed8f0c5 100644 --- a/tcp_splice.h +++ b/tcp_splice.h @@ -12,8 +12,9 @@ union sockaddr_inany; void tcp_splice_sock_handler(struct ctx *c, union epoll_ref ref, uint32_t events); 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); + uint8_t pif0, in_port_t dstport, + union flow *flow, int s0, + const union sockaddr_inany *sa); void tcp_splice_init(struct ctx *c); #endif /* TCP_SPLICE_H */