diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2024-08-29 19:58:45 +1000 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2024-08-29 22:25:51 +0200 |
commit | 1daf6f4615226a2cdd9523a80d70736af4a9f3c0 (patch) | |
tree | 12df1676a4627a91cf80fe5833f59b7ea08cb77d /conf.c | |
parent | 712ca3235329b049bf9a4e481ba38a4c64768e8b (diff) | |
download | passt-1daf6f4615226a2cdd9523a80d70736af4a9f3c0.tar passt-1daf6f4615226a2cdd9523a80d70736af4a9f3c0.tar.gz passt-1daf6f4615226a2cdd9523a80d70736af4a9f3c0.tar.bz2 passt-1daf6f4615226a2cdd9523a80d70736af4a9f3c0.tar.lz passt-1daf6f4615226a2cdd9523a80d70736af4a9f3c0.tar.xz passt-1daf6f4615226a2cdd9523a80d70736af4a9f3c0.tar.zst passt-1daf6f4615226a2cdd9523a80d70736af4a9f3c0.zip |
conf, fwd: Make ephemeral port logic more flexible
"Ephemeral" ports are those which the kernel may allocate as local
port numbers for outgoing connections or datagrams. Because of that,
they're generally not good choices for listening servers to bind to.
Thefore when using -t all, -u all or exclude-only ranges, we map only
non-ephemeral ports. Our logic for this is a bit rigid though: we
assume the ephemeral ports are always a fixed range at the top of the
port number space. We also assume PORT_EPHEMERAL_MIN is a multiple of
8, or we won't set the forward bitmap correctly.
Make the logic in conf.c more flexible, using a helper moved into
fwd.[ch], although we don't change which ports we consider ephemeral
(yet).
The new handling is undoubtedly more computationally expensive, but
since it's a once-off operation at start off, I don't think it really
matters.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Reviewed-by: Laurent Vivier <lvivier@redhat.com>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Diffstat (limited to 'conf.c')
-rw-r--r-- | conf.c | 12 |
1 files changed, 8 insertions, 4 deletions
@@ -156,9 +156,12 @@ static void conf_ports(const struct ctx *c, char optname, const char *optarg, die("'all' port forwarding is only allowed for passt"); fwd->mode = FWD_ALL; - memset(fwd->map, 0xff, PORT_EPHEMERAL_MIN / 8); - for (i = 0; i < PORT_EPHEMERAL_MIN; i++) { + for (i = 0; i < NUM_PORTS; i++) { + if (fwd_port_is_ephemeral(i)) + continue; + + bitmap_set(fwd->map, i); if (optname == 't') { ret = tcp_sock_init(c, AF_UNSPEC, NULL, NULL, i); @@ -259,8 +262,9 @@ static void conf_ports(const struct ctx *c, char optname, const char *optarg, } while ((p = next_chunk(p, ','))); if (exclude_only) { - for (i = 0; i < PORT_EPHEMERAL_MIN; i++) { - if (bitmap_isset(exclude, i)) + for (i = 0; i < NUM_PORTS; i++) { + if (fwd_port_is_ephemeral(i) || + bitmap_isset(exclude, i)) continue; bitmap_set(fwd->map, i); |