From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail.ozlabs.org (gandalf.ozlabs.org [150.107.74.76]) by passt.top (Postfix) with ESMTPS id D0DA25A0319 for ; Tue, 16 Jul 2024 07:29:42 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gibson.dropbear.id.au; s=202312; t=1721107778; bh=lUTJ/hmT3AapPhba4CbkFULoWzA5SViGjZTm1N7akcw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lyp/xpdwCa571I4WQNXrvmf4ly/XB9aTuCl+RKdGQZnj/w5NGLdOX4K+A12VqZz/B VN7moFgrfQOENdWClENSL4sNYZEJUmrSSoNnlVUL8hZzDUMQNhW0jZMVQoBwNM0yoK qeA3Nkq5Av+tKza14EyLdvLwmYm3Q/A+8OnW1gx4IuAk58By4NXO7wl0PAnK5b4M7L e0UZXjuG7RnvfzbPv+96GyIBoR+BrUkw3MQFg0JdkkTdz1hAyR8amTamGnuL/6fMdb S7Bv4osud4/L5oVWBB/kE/97M4f64yDMQxlbWOKDhp4U94FGu6LRFbEpuFpppDgILP ULEfvRf6FBr0g== Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4WNSLV4xNRz4wnx; Tue, 16 Jul 2024 15:29:38 +1000 (AEST) From: David Gibson To: Stefano Brivio , passt-dev@passt.top Subject: [PATCH 3/5] udp, tcp: Tweak handling of no_udp and no_tcp flags Date: Tue, 16 Jul 2024 15:29:34 +1000 Message-ID: <20240716052936.1204164-4-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240716052936.1204164-1-david@gibson.dropbear.id.au> References: <20240716052936.1204164-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Message-ID-Hash: OPEKJ2UQINFQHF7XAH2ZLVPBGUEMFGUL X-Message-ID-Hash: OPEKJ2UQINFQHF7XAH2ZLVPBGUEMFGUL X-MailFrom: dgibson@gandalf.ozlabs.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: David Gibson X-Mailman-Version: 3.3.8 Precedence: list List-Id: Development discussion and patches for passt Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: We abort the UDP socket handler if the no_udp flag is set. But if UDP was disabled we should never have had a UDP socket to trigger the handler in the first place. If we somehow did, ignoring it here isn't really going to help because aborting without doing anything is likely to lead to an epoll loop. The same is the case for the TCP socket and timer handlers and the no_tcp flag. Change these checks on the flag to ASSERT()s. Similarly add ASSERT()s to several other entry points to the protocol specific code which should never be called if the protocol is disabled. Signed-off-by: David Gibson --- tcp.c | 14 +++++++++++--- udp.c | 13 +++++++++++-- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/tcp.c b/tcp.c index 75b959a2..de3f9f64 100644 --- a/tcp.c +++ b/tcp.c @@ -2286,7 +2286,9 @@ void tcp_listen_handler(struct ctx *c, union epoll_ref ref, union flow *flow; int s; - if (c->no_tcp || !(flow = flow_alloc())) + ASSERT(!c->no_tcp); + + if (!(flow = flow_alloc())) return; s = accept4(ref.fd, &sa.sa, &sl, SOCK_NONBLOCK); @@ -2339,8 +2341,7 @@ void tcp_timer_handler(struct ctx *c, union epoll_ref ref) struct itimerspec check_armed = { { 0 }, { 0 } }; struct tcp_tap_conn *conn = CONN(ref.flow); - if (c->no_tcp) - return; + ASSERT(!c->no_tcp); /* We don't reset timers on ~ACK_FROM_TAP_DUE, ~ACK_TO_TAP_DUE. If the * timer is currently armed, this event came from a previous setting, @@ -2398,6 +2399,7 @@ void tcp_sock_handler(struct ctx *c, union epoll_ref ref, uint32_t events) { struct tcp_tap_conn *conn = CONN(ref.flowside.flow); + ASSERT(!c->no_tcp); ASSERT(conn->f.type == FLOW_TCP); ASSERT(conn->f.pif[ref.flowside.side] != PIF_TAP); @@ -2497,6 +2499,8 @@ int tcp_sock_init(const struct ctx *c, sa_family_t af, const void *addr, { int r4 = FD_REF_MAX + 1, r6 = FD_REF_MAX + 1; + ASSERT(!c->no_tcp); + if (af == AF_UNSPEC && c->ifi4 && c->ifi6) /* Attempt to get a dual stack socket */ if (tcp_sock_init_af(c, AF_UNSPEC, port, addr, ifname) >= 0) @@ -2574,6 +2578,8 @@ static void tcp_ns_sock_init6(const struct ctx *c, in_port_t port) */ void tcp_ns_sock_init(const struct ctx *c, in_port_t port) { + ASSERT(!c->no_tcp); + if (c->ifi4) tcp_ns_sock_init4(c, port); if (c->ifi6) @@ -2661,6 +2667,8 @@ int tcp_init(struct ctx *c) { unsigned b; + ASSERT(!c->no_tcp); + for (b = 0; b < TCP_HASH_TABLE_SIZE; b++) tc_hash[b] = FLOW_SIDX_NONE; diff --git a/udp.c b/udp.c index 187483f0..fbf3ce73 100644 --- a/udp.c +++ b/udp.c @@ -749,7 +749,9 @@ static int udp_sock_recv(const struct ctx *c, int s, uint32_t events, */ int n = (c->mode == MODE_PASTA ? 1 : UDP_MAX_FRAMES); - if (c->no_udp || !(events & EPOLLIN)) + ASSERT(!c->no_udp); + + if (!(events & EPOLLIN)) return 0; n = recvmmsg(s, mmh, n, 0, NULL); @@ -849,10 +851,11 @@ int udp_tap_handler(struct ctx *c, uint8_t pif, in_port_t src, dst; socklen_t sl; - (void)c; (void)saddr; (void)pif; + ASSERT(!c->no_udp); + uh = packet_get(p, idx, 0, sizeof(*uh), NULL); if (!uh) return 1; @@ -1026,6 +1029,8 @@ int udp_sock_init(const struct ctx *c, int ns, sa_family_t af, .orig = true, .port = port }; int s, r4 = FD_REF_MAX + 1, r6 = FD_REF_MAX + 1; + ASSERT(!c->no_udp); + if (ns) uref.pif = PIF_SPLICE; else @@ -1214,6 +1219,8 @@ void udp_timer(struct ctx *c, const struct timespec *now) unsigned int i; long *word, tmp; + ASSERT(!c->no_udp); + if (c->mode == MODE_PASTA) { if (c->udp.fwd_out.f.mode == FWD_AUTO) { fwd_scan_ports_udp(&c->udp.fwd_out.f, &c->udp.fwd_in.f, @@ -1257,6 +1264,8 @@ v6: */ int udp_init(struct ctx *c) { + ASSERT(!c->no_udp); + udp_iov_init(c); udp_invert_portmap(&c->udp.fwd_in); -- 2.45.2