public inbox for passt-dev@passt.top
 help / color / mirror / code / Atom feed
From: Paul Holzinger <pholzing@redhat.com>
To: passt-dev@passt.top
Cc: Paul Holzinger <pholzing@redhat.com>
Subject: [PATCH] pasta: fix tcp port forwarding in auto mode
Date: Mon, 20 Mar 2023 19:10:34 +0100	[thread overview]
Message-ID: <20230320181034.87131-1-pholzing@redhat.com> (raw)

The logic in tcp_timer() was inverted. fwd_out should expose the host
ports in the ns. Therfore it must read the ports on the host and then
bind them in the netns. The same for fwd_in which checks ports in the
ns and then exposes them on the host.

Note that this only fixes tcp ports, udp does not seems to work at all
right now with the auto mode.

Signed-off-by: Paul Holzinger <pholzing@redhat.com>
---
 tcp.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/tcp.c b/tcp.c
index 0214087..0d0ad13 100644
--- a/tcp.c
+++ b/tcp.c
@@ -89,7 +89,7 @@
  * No port translation is needed for connections initiated remotely or by the
  * local host: source port from socket is reused while establishing connections
  * to the guest.
- * 
+ *
  * For connections initiated by the guest, it's not possible to force the same
  * source port as connections are established by the host kernel: that's the
  * only port translation needed.
@@ -173,7 +173,7 @@
  *   new socket is created and mapped in connection tracking table, setting
  *   MSS and window clamping from header and option of the observed SYN segment
  *
- * 
+ *
  * Aging and timeout
  * -----------------
  *
@@ -560,7 +560,7 @@ static struct tcp6_l2_flags_buf_t {
 #endif
 	struct tap_hdr taph;	/* 14					   2 */
 	struct ipv6hdr ip6h;	/* 32					  20 */
-	struct tcphdr th	/* 72 */ __attribute__ ((aligned(4))); /* 60 */ 
+	struct tcphdr th	/* 72 */ __attribute__ ((aligned(4))); /* 60 */
 	char opts[OPT_MSS_LEN + OPT_WS_LEN + 1];
 #ifdef __AVX2__
 } __attribute__ ((packed, aligned(32)))
@@ -3308,14 +3308,14 @@ void tcp_timer(struct ctx *c, const struct timespec *ts)
 		struct tcp_port_detect_arg detect_arg = { c, 0 };
 		struct tcp_port_rebind_arg rebind_arg = { c, 0 };
 
-		if (c->tcp.fwd_in.mode == FWD_AUTO) {
+		if (c->tcp.fwd_out.mode == FWD_AUTO) {
 			detect_arg.detect_in_ns = 0;
 			tcp_port_detect(&detect_arg);
 			rebind_arg.bind_in_ns = 1;
 			NS_CALL(tcp_port_rebind, &rebind_arg);
 		}
 
-		if (c->tcp.fwd_out.mode == FWD_AUTO) {
+		if (c->tcp.fwd_in.mode == FWD_AUTO) {
 			detect_arg.detect_in_ns = 1;
 			NS_CALL(tcp_port_detect, &detect_arg);
 			rebind_arg.bind_in_ns = 0;
-- 
@@ -89,7 +89,7 @@
  * No port translation is needed for connections initiated remotely or by the
  * local host: source port from socket is reused while establishing connections
  * to the guest.
- * 
+ *
  * For connections initiated by the guest, it's not possible to force the same
  * source port as connections are established by the host kernel: that's the
  * only port translation needed.
@@ -173,7 +173,7 @@
  *   new socket is created and mapped in connection tracking table, setting
  *   MSS and window clamping from header and option of the observed SYN segment
  *
- * 
+ *
  * Aging and timeout
  * -----------------
  *
@@ -560,7 +560,7 @@ static struct tcp6_l2_flags_buf_t {
 #endif
 	struct tap_hdr taph;	/* 14					   2 */
 	struct ipv6hdr ip6h;	/* 32					  20 */
-	struct tcphdr th	/* 72 */ __attribute__ ((aligned(4))); /* 60 */ 
+	struct tcphdr th	/* 72 */ __attribute__ ((aligned(4))); /* 60 */
 	char opts[OPT_MSS_LEN + OPT_WS_LEN + 1];
 #ifdef __AVX2__
 } __attribute__ ((packed, aligned(32)))
@@ -3308,14 +3308,14 @@ void tcp_timer(struct ctx *c, const struct timespec *ts)
 		struct tcp_port_detect_arg detect_arg = { c, 0 };
 		struct tcp_port_rebind_arg rebind_arg = { c, 0 };
 
-		if (c->tcp.fwd_in.mode == FWD_AUTO) {
+		if (c->tcp.fwd_out.mode == FWD_AUTO) {
 			detect_arg.detect_in_ns = 0;
 			tcp_port_detect(&detect_arg);
 			rebind_arg.bind_in_ns = 1;
 			NS_CALL(tcp_port_rebind, &rebind_arg);
 		}
 
-		if (c->tcp.fwd_out.mode == FWD_AUTO) {
+		if (c->tcp.fwd_in.mode == FWD_AUTO) {
 			detect_arg.detect_in_ns = 1;
 			NS_CALL(tcp_port_detect, &detect_arg);
 			rebind_arg.bind_in_ns = 0;
-- 
2.39.2


             reply	other threads:[~2023-03-20 18:11 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-20 18:10 Paul Holzinger [this message]
2023-03-21  8:18 ` [PATCH] pasta: fix tcp port forwarding in auto mode Stefano Brivio
2023-03-21 13:55   ` Paul Holzinger
2023-03-21 14:02     ` Stefano Brivio
2023-03-21 23:30       ` Stefano Brivio
2023-03-21 15:25   ` Stefano Brivio

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230320181034.87131-1-pholzing@redhat.com \
    --to=pholzing@redhat.com \
    --cc=passt-dev@passt.top \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://passt.top/passt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for IMAP folder(s).