From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from gandalf.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3]) by passt.top (Postfix) with ESMTPS id C9B865A026D for ; Thu, 5 Oct 2023 05:44:54 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gibson.dropbear.id.au; s=201602; t=1696477489; bh=CLY88OFOYwxyD+qRytYQ04HHn7DV9auxoIdSvFvKrtI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=RtuNB/AL8RIgbfdpoTrMMwW2tXILFPMkp0iFc0zg4YQPYummiAupvOfbQT9kDdUYo 2oJ7VSm+6f2ldjonq6+fx6bV9HW9VJwLyYh05HiY1jZifHgr2UqPufCgA2wiKBANl6 zatcE5UHrqXcaOQv4RgNhRUK9j1fFdyN+e4OtQ7Y= Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4S1HW51Hf7z4xTy; Thu, 5 Oct 2023 14:44:49 +1100 (AEDT) From: David Gibson To: Stefano Brivio , passt-dev@passt.top Subject: [PATCH 3/9] port_fwd: Better parameterise procfs_scan_listen() Date: Thu, 5 Oct 2023 14:44:39 +1100 Message-ID: <20231005034445.2015303-4-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231005034445.2015303-1-david@gibson.dropbear.id.au> References: <20231005034445.2015303-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Message-ID-Hash: I73YONE7IOXFPH4ZFNEWCH3GYZH5LIWI X-Message-ID-Hash: I73YONE7IOXFPH4ZFNEWCH3GYZH5LIWI 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: procfs_scan_listen() does some slightly clunky logic to deduce the fd it wants to use, the path it wants to open and the state it's looking for based on parameters for protocol, IP version and whether we're in the namespace. However, the caller already has to make choices based on similar parameters so it can just pass in the things that procfs_scan_listen() needs directly. Signed-off-by: David Gibson --- port_fwd.c | 53 +++++++++++++++++++++++------------------------------ 1 file changed, 23 insertions(+), 30 deletions(-) diff --git a/port_fwd.c b/port_fwd.c index 136a450..4b54877 100644 --- a/port_fwd.c +++ b/port_fwd.c @@ -23,39 +23,27 @@ #include "passt.h" #include "lineread.h" +#define UDP_LISTEN 0x07 +#define TCP_LISTEN 0x0a + /** * procfs_scan_listen() - Set bits for listening TCP or UDP sockets from procfs - * @proto: IPPROTO_TCP or IPPROTO_UDP - * @ip_version: IP version, V4 or V6 - * @ns: Use saved file descriptors for namespace if set + * @fd: Pointer to fd for relevant /proc/net file + * @path: Path to /proc/net file to open (if fd is -1) + * @lstate: Code for listening state to scan for * @map: Bitmap where numbers of ports in listening state will be set * @exclude: Bitmap of ports to exclude from setting (and clear) * * #syscalls:pasta lseek * #syscalls:pasta ppc64le:_llseek ppc64:_llseek armv6l:_llseek armv7l:_llseek */ -static void procfs_scan_listen(struct ctx *c, uint8_t proto, int ip_version, - int ns, uint8_t *map, const uint8_t *exclude) +static void procfs_scan_listen(int *fd, const char *path, unsigned int lstate, + uint8_t *map, const uint8_t *exclude) { - char *path, *line; struct lineread lr; unsigned long port; unsigned int state; - int *fd; - - if (proto == IPPROTO_TCP) { - fd = &c->proc_net_tcp[ip_version][ns]; - if (ip_version == V4) - path = "/proc/net/tcp"; - else - path = "/proc/net/tcp6"; - } else { - fd = &c->proc_net_udp[ip_version][ns]; - if (ip_version == V4) - path = "/proc/net/udp"; - else - path = "/proc/net/udp6"; - } + char *line; if (*fd != -1) { if (lseek(*fd, 0, SEEK_SET)) { @@ -74,8 +62,7 @@ static void procfs_scan_listen(struct ctx *c, uint8_t proto, int ip_version, continue; /* See enum in kernel's include/net/tcp_states.h */ - if ((proto == IPPROTO_TCP && state != 0x0a) || - (proto == IPPROTO_UDP && state != 0x07)) + if (state != lstate) continue; if (bitmap_isset(exclude, port)) @@ -109,15 +96,21 @@ void get_bound_ports(struct ctx *c, int ns, uint8_t proto) if (proto == IPPROTO_UDP) { memset(udp_map, 0, PORT_BITMAP_SIZE); - procfs_scan_listen(c, IPPROTO_UDP, V4, ns, udp_map, udp_excl); - procfs_scan_listen(c, IPPROTO_UDP, V6, ns, udp_map, udp_excl); - - procfs_scan_listen(c, IPPROTO_TCP, V4, ns, udp_map, udp_excl); - procfs_scan_listen(c, IPPROTO_TCP, V6, ns, udp_map, udp_excl); + procfs_scan_listen(&c->proc_net_udp[V4][ns], "/proc/net/udp", + UDP_LISTEN, udp_map, udp_excl); + procfs_scan_listen(&c->proc_net_udp[V6][ns], "/proc/net/udp6", + UDP_LISTEN, udp_map, udp_excl); + + procfs_scan_listen(&c->proc_net_tcp[V4][ns], "/proc/net/tcp", + TCP_LISTEN, udp_map, udp_excl); + procfs_scan_listen(&c->proc_net_tcp[V6][ns], "/proc/net/tcp6", + TCP_LISTEN, udp_map, udp_excl); } else if (proto == IPPROTO_TCP) { memset(tcp_map, 0, PORT_BITMAP_SIZE); - procfs_scan_listen(c, IPPROTO_TCP, V4, ns, tcp_map, tcp_excl); - procfs_scan_listen(c, IPPROTO_TCP, V6, ns, tcp_map, tcp_excl); + procfs_scan_listen(&c->proc_net_tcp[V4][ns], "/proc/net/tcp", + TCP_LISTEN, tcp_map, tcp_excl); + procfs_scan_listen(&c->proc_net_tcp[V6][ns], "/proc/net/tcp6", + TCP_LISTEN, tcp_map, tcp_excl); } } -- 2.41.0