When auto-forwarding based on port scans, we must exclude our own
listening ports, to avoid circular forwards. Currently we use the (old)
forwarding bitmaps for the reverse direction to determine that.
Instead, generate it from the tables of listening sockets that we now
maintain. For now this seems like a lot more work to get to the same
place. However, it does mean we're basing our exclusions directly on the
relevant information: which of the scanned listens belong to us. More
importantly, it's a step towards removing the bitmaps entirely.
Signed-off-by: David Gibson
---
fwd.c | 30 ++++++++++++++++++++++++++----
1 file changed, 26 insertions(+), 4 deletions(-)
diff --git a/fwd.c b/fwd.c
index 21e852af..848930a9 100644
--- a/fwd.c
+++ b/fwd.c
@@ -628,6 +628,28 @@ static void fwd_scan_ports_udp(struct fwd_ports *fwd,
bitmap_and_not(fwd->map, PORT_BITMAP_SIZE, fwd->map, exclude);
}
+/**
+ * current_listen_map() - Get bitmap of which ports we're already listening on
+ * @map: Bitmap to populate
+ * @fwd: Forwarding table to consider
+ */
+static void current_listen_map(uint8_t *map, const struct fwd_ports *fwd)
+{
+ unsigned i;
+
+ memset(map, 0, PORT_BITMAP_SIZE);
+
+ for (i = 0; i < fwd->count; i++) {
+ const struct fwd_entry *fe = &fwd->tab[i];
+ unsigned port;
+
+ for (port = fe->first; port <= fe->last; port++) {
+ if (fe->socks[port - fe->first] >= 0)
+ bitmap_set(map, port);
+ }
+ }
+}
+
/**
* fwd_scan_ports() - Scan automatic port forwarding information
* @c: Execution context
@@ -637,10 +659,10 @@ static void fwd_scan_ports(struct ctx *c)
uint8_t excl_tcp_out[PORT_BITMAP_SIZE], excl_udp_out[PORT_BITMAP_SIZE];
uint8_t excl_tcp_in[PORT_BITMAP_SIZE], excl_udp_in[PORT_BITMAP_SIZE];
- memcpy(excl_tcp_out, c->tcp.fwd_in.map, sizeof(excl_tcp_out));
- memcpy(excl_tcp_in, c->tcp.fwd_out.map, sizeof(excl_tcp_in));
- memcpy(excl_udp_out, c->udp.fwd_in.map, sizeof(excl_udp_out));
- memcpy(excl_udp_in, c->udp.fwd_out.map, sizeof(excl_udp_in));
+ current_listen_map(excl_tcp_out, &c->tcp.fwd_in);
+ current_listen_map(excl_tcp_in, &c->tcp.fwd_out);
+ current_listen_map(excl_udp_out, &c->udp.fwd_in);
+ current_listen_map(excl_udp_in, &c->udp.fwd_out);
fwd_scan_ports_tcp(&c->tcp.fwd_out, excl_tcp_out);
fwd_scan_ports_tcp(&c->tcp.fwd_in, excl_tcp_in);
--
2.52.0