conf: Demote overlapping port ranges error to a warning

We give a fatal error if the port ranges from any port forwarding
specifiers overlap.  This occurs even if those port ranges are specifically
bound to different addresses, so there's not really any overlap.

Right now, we can't 100% handle this case correctly, because our data
structures don't have a way to represent per-address forwarding.  However,
there are a number of cases that will actually work just fine: e.g. mapping
the same port to the same port on two different addresses (say :: and
127.0.0.1).

We have long term plans to fix this properly, but that is still some time
away.  For the time being, demote this error to a warning so that the cases
that already work will be allowed.

Link: https://bugs.passt.top/show_bug.cgi?id=56
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
David Gibson 2023-08-11 17:36:00 +10:00 committed by Stefano Brivio
parent ae5f6c8e1b
commit 5ed4e034b2

7
conf.c
View file

@ -303,7 +303,7 @@ static void conf_ports(const struct ctx *c, char optname, const char *optarg,
for (i = xrange.first; i <= xrange.last; i++) {
if (bitmap_isset(exclude, i))
goto overlap;
die("Overlapping excluded ranges %s", optarg);
bitmap_set(exclude, i);
}
@ -370,7 +370,8 @@ static void conf_ports(const struct ctx *c, char optname, const char *optarg,
for (i = orig_range.first; i <= orig_range.last; i++) {
if (bitmap_isset(fwd->map, i))
goto overlap;
warn(
"Altering mapping of already mapped port number: %s", optarg);
if (bitmap_isset(exclude, i))
continue;
@ -406,8 +407,6 @@ enfile:
die("Can't open enough sockets for port specifier: %s", optarg);
bad:
die("Invalid port specifier %s", optarg);
overlap:
die("Overlapping port specifier %s", optarg);
mode_conflict:
die("Port forwarding mode '%s' conflicts with previous mode", optarg);
bind_fail: