aboutgitcodebugslistschat
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2023-11-03 13:23:03 +1100
committerStefano Brivio <sbrivio@redhat.com>2023-11-07 09:53:31 +0100
commitc09d0d0f6085944a7b0e58434148702b2d5f5e9a (patch)
treee15fa3f4ce3f9833ca6f79fda56d0b8f6f54f745
parentdcf5c0eb1e877f1de84c94bb07c30d109cb85b70 (diff)
downloadpasst-c09d0d0f6085944a7b0e58434148702b2d5f5e9a.tar
passt-c09d0d0f6085944a7b0e58434148702b2d5f5e9a.tar.gz
passt-c09d0d0f6085944a7b0e58434148702b2d5f5e9a.tar.bz2
passt-c09d0d0f6085944a7b0e58434148702b2d5f5e9a.tar.lz
passt-c09d0d0f6085944a7b0e58434148702b2d5f5e9a.tar.xz
passt-c09d0d0f6085944a7b0e58434148702b2d5f5e9a.tar.zst
passt-c09d0d0f6085944a7b0e58434148702b2d5f5e9a.zip
port_fwd: Simplify get_bound_ports_*() to port_fwd_scan_*()
get_bound_ports_*() now only use their context and ns parameters to determine which forwarding maps they're operating on. Each function needs the map they're actually updating, as well as the map for the other direction, to avoid creating forwarding loops. The UDP function also requires the corresponding TCP map, to implement the behaviour where we forward UDP ports of the same number as bound TCP ports for tools like iperf3. Passing those maps directly as parameters simplifies the code without making the callers life harder, because those already know the relevant maps. IMO, invoking these functions in terms of where they're looking for updated forwarding also makes more logical sense than in terms of where they're looking for bound ports. Given that new way of looking at the functions, also rename them to port_fwd_scan_*(). Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
-rw-r--r--port_fwd.c50
-rw-r--r--port_fwd.h5
-rw-r--r--tcp.c4
3 files changed, 21 insertions, 38 deletions
diff --git a/port_fwd.c b/port_fwd.c
index 9502463..fc4d5cb 100644
--- a/port_fwd.c
+++ b/port_fwd.c
@@ -68,46 +68,26 @@ static void procfs_scan_listen(int fd, unsigned int lstate,
}
/**
- * get_bound_ports_tcp() - Get maps of TCP ports with bound sockets
- * @c: Execution context
- * @ns: If set, set bitmaps for ports to tap/ns -- to init otherwise
+ * port_fwd_scan_tcp() - Scan /proc to update TCP forwarding map
+ * @fwd: Forwarding information to update
+ * @rev: Forwarding information for the reverse direction
*/
-void get_bound_ports_tcp(struct ctx *c, int ns)
+void port_fwd_scan_tcp(struct port_fwd *fwd, const struct port_fwd *rev)
{
- struct port_fwd *fwd, *rev;
-
- if (ns) {
- fwd = &c->tcp.fwd_in;
- rev = &c->tcp.fwd_out;
- } else {
- fwd = &c->tcp.fwd_out;
- rev = &c->tcp.fwd_in;
- }
-
memset(fwd->map, 0, PORT_BITMAP_SIZE);
procfs_scan_listen(fwd->scan4, TCP_LISTEN, fwd->map, rev->map);
procfs_scan_listen(fwd->scan6, TCP_LISTEN, fwd->map, rev->map);
}
/**
- * get_bound_ports_udp() - Get maps of UDP ports with bound sockets
- * @c: Execution context
- * @ns: If set, set bitmaps for ports to tap/ns -- to init otherwise
+ * port_fwd_scan_tcp() - Scan /proc to update TCP forwarding map
+ * @fwd: Forwarding information to update
+ * @rev: Forwarding information for the reverse direction
+ * @tcp: Corresponding TCP forwarding information
*/
-void get_bound_ports_udp(struct ctx *c, int ns)
+void port_fwd_scan_udp(struct port_fwd *fwd, const struct port_fwd *rev,
+ const struct port_fwd *tcp)
{
- struct port_fwd *fwd, *rev, *tcp;
-
- if (ns) {
- fwd = &c->udp.fwd_in.f;
- rev = &c->udp.fwd_out.f;
- tcp = &c->tcp.fwd_in;
- } else {
- fwd = &c->udp.fwd_out.f;
- rev = &c->udp.fwd_in.f;
- tcp = &c->tcp.fwd_out;
- }
-
memset(fwd->map, 0, PORT_BITMAP_SIZE);
procfs_scan_listen(fwd->scan4, UDP_LISTEN, fwd->map, rev->map);
procfs_scan_listen(fwd->scan6, UDP_LISTEN, fwd->map, rev->map);
@@ -137,21 +117,23 @@ void port_fwd_init(struct ctx *c)
if (c->tcp.fwd_in.mode == FWD_AUTO) {
c->tcp.fwd_in.scan4 = open_in_ns(c, "/proc/net/tcp", flags);
c->tcp.fwd_in.scan6 = open_in_ns(c, "/proc/net/tcp6", flags);
- get_bound_ports_tcp(c, 1);
+ port_fwd_scan_tcp(&c->tcp.fwd_in, &c->tcp.fwd_out);
}
if (c->udp.fwd_in.f.mode == FWD_AUTO) {
c->udp.fwd_in.f.scan4 = open_in_ns(c, "/proc/net/udp", flags);
c->udp.fwd_in.f.scan6 = open_in_ns(c, "/proc/net/udp6", flags);
- get_bound_ports_udp(c, 1);
+ port_fwd_scan_udp(&c->udp.fwd_in.f, &c->udp.fwd_out.f,
+ &c->tcp.fwd_in);
}
if (c->tcp.fwd_out.mode == FWD_AUTO) {
c->tcp.fwd_out.scan4 = open("/proc/net/tcp", flags);
c->tcp.fwd_out.scan6 = open("/proc/net/tcp6", flags);
- get_bound_ports_tcp(c, 0);
+ port_fwd_scan_tcp(&c->tcp.fwd_out, &c->tcp.fwd_in);
}
if (c->udp.fwd_out.f.mode == FWD_AUTO) {
c->udp.fwd_out.f.scan4 = open("/proc/net/udp", flags);
c->udp.fwd_out.f.scan6 = open("/proc/net/udp6", flags);
- get_bound_ports_udp(c, 0);
+ port_fwd_scan_udp(&c->udp.fwd_out.f, &c->udp.fwd_in.f,
+ &c->tcp.fwd_out);
}
}
diff --git a/port_fwd.h b/port_fwd.h
index 8ab6b48..8a823d8 100644
--- a/port_fwd.h
+++ b/port_fwd.h
@@ -35,8 +35,9 @@ struct port_fwd {
in_port_t delta[NUM_PORTS];
};
-void get_bound_ports_tcp(struct ctx *c, int ns);
-void get_bound_ports_udp(struct ctx *c, int ns);
+void port_fwd_scan_tcp(struct port_fwd *fwd, const struct port_fwd *rev);
+void port_fwd_scan_udp(struct port_fwd *fwd, const struct port_fwd *rev,
+ const struct port_fwd *tcp);
void port_fwd_init(struct ctx *c);
#endif /* PORT_FWD_H */
diff --git a/tcp.c b/tcp.c
index 5b41897..c13b7de 100644
--- a/tcp.c
+++ b/tcp.c
@@ -3287,13 +3287,13 @@ void tcp_timer(struct ctx *c, const struct timespec *ts)
struct tcp_port_rebind_arg rebind_arg = { c, 0 };
if (c->tcp.fwd_out.mode == FWD_AUTO) {
- get_bound_ports_tcp(c, 0);
+ port_fwd_scan_tcp(&c->tcp.fwd_out, &c->tcp.fwd_in);
rebind_arg.bind_in_ns = 1;
NS_CALL(tcp_port_rebind, &rebind_arg);
}
if (c->tcp.fwd_in.mode == FWD_AUTO) {
- get_bound_ports_tcp(c, 1);
+ port_fwd_scan_tcp(&c->tcp.fwd_in, &c->tcp.fwd_out);
rebind_arg.bind_in_ns = 0;
tcp_port_rebind(&rebind_arg);
}