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:
parent
ae5f6c8e1b
commit
5ed4e034b2
1 changed files with 3 additions and 4 deletions
7
conf.c
7
conf.c
|
@ -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++) {
|
for (i = xrange.first; i <= xrange.last; i++) {
|
||||||
if (bitmap_isset(exclude, i))
|
if (bitmap_isset(exclude, i))
|
||||||
goto overlap;
|
die("Overlapping excluded ranges %s", optarg);
|
||||||
|
|
||||||
bitmap_set(exclude, i);
|
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++) {
|
for (i = orig_range.first; i <= orig_range.last; i++) {
|
||||||
if (bitmap_isset(fwd->map, i))
|
if (bitmap_isset(fwd->map, i))
|
||||||
goto overlap;
|
warn(
|
||||||
|
"Altering mapping of already mapped port number: %s", optarg);
|
||||||
|
|
||||||
if (bitmap_isset(exclude, i))
|
if (bitmap_isset(exclude, i))
|
||||||
continue;
|
continue;
|
||||||
|
@ -406,8 +407,6 @@ enfile:
|
||||||
die("Can't open enough sockets for port specifier: %s", optarg);
|
die("Can't open enough sockets for port specifier: %s", optarg);
|
||||||
bad:
|
bad:
|
||||||
die("Invalid port specifier %s", optarg);
|
die("Invalid port specifier %s", optarg);
|
||||||
overlap:
|
|
||||||
die("Overlapping port specifier %s", optarg);
|
|
||||||
mode_conflict:
|
mode_conflict:
|
||||||
die("Port forwarding mode '%s' conflicts with previous mode", optarg);
|
die("Port forwarding mode '%s' conflicts with previous mode", optarg);
|
||||||
bind_fail:
|
bind_fail:
|
||||||
|
|
Loading…
Reference in a new issue