netlink: With no default route, pick the first interface with a route
While commit f919dc7a4b
("conf, netlink: Don't require a default
route to start") sounded reasonable in the assumption that, if we
don't find default routes for a given address family, we can still
proceed by selecting an interface with any route *iff it's the only
one for that protocol family*, Jelle reported a further issue in a
similar setup.
There, multiple interfaces are present, and while remote container
connectivity doesn't matter for the container, local connectivity is
desired. There are no default routes, but those multiple interfaces
all have non-default routes, so we should just pick one and start.
Pick the first interface reported by the kernel with any route, if
there are no default routes. There should be no harm in doing so.
Reported-by: Jelle van der Waa <jvanderwaa@redhat.com>
Reported-by: Martin Pitt <mpitt@redhat.com>
Link: https://bugzilla.redhat.com/show_bug.cgi?id=2277954
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
Reviewed-by: Paul Holzinger <pholzing@redhat.com>
This commit is contained in:
parent
54a9d3801b
commit
450a6131be
2 changed files with 10 additions and 10 deletions
14
netlink.c
14
netlink.c
|
@ -269,8 +269,7 @@ unsigned int nl_get_ext_if(int s, sa_family_t af)
|
||||||
size_t na;
|
size_t na;
|
||||||
|
|
||||||
/* Look for an interface with a default route first, failing that, look
|
/* Look for an interface with a default route first, failing that, look
|
||||||
* for any interface with a route, and pick it only if it's the only
|
* for any interface with a route, and pick the first one, if any.
|
||||||
* interface with a route.
|
|
||||||
*/
|
*/
|
||||||
seq = nl_send(s, &req, RTM_GETROUTE, NLM_F_DUMP, sizeof(req));
|
seq = nl_send(s, &req, RTM_GETROUTE, NLM_F_DUMP, sizeof(req));
|
||||||
nl_foreach_oftype(nh, status, s, buf, seq, RTM_NEWROUTE) {
|
nl_foreach_oftype(nh, status, s, buf, seq, RTM_NEWROUTE) {
|
||||||
|
@ -324,19 +323,20 @@ unsigned int nl_get_ext_if(int s, sa_family_t af)
|
||||||
warn("netlink: RTM_GETROUTE failed: %s", strerror(-status));
|
warn("netlink: RTM_GETROUTE failed: %s", strerror(-status));
|
||||||
|
|
||||||
if (defifi) {
|
if (defifi) {
|
||||||
if (ndef > 1)
|
if (ndef > 1) {
|
||||||
info("Multiple default %s routes, picked first",
|
info("Multiple default %s routes, picked first",
|
||||||
af_name(af));
|
af_name(af));
|
||||||
|
}
|
||||||
return defifi;
|
return defifi;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (anyifi) {
|
if (anyifi) {
|
||||||
if (nany == 1)
|
if (nany > 1) {
|
||||||
return anyifi;
|
info("Multiple interfaces with %s routes, picked first",
|
||||||
|
|
||||||
info("Multiple interfaces with %s routes, use -i to select one",
|
|
||||||
af_name(af));
|
af_name(af));
|
||||||
}
|
}
|
||||||
|
return anyifi;
|
||||||
|
}
|
||||||
|
|
||||||
if (!nany)
|
if (!nany)
|
||||||
info("No interfaces with usable %s routes", af_name(af));
|
info("No interfaces with usable %s routes", af_name(af));
|
||||||
|
|
4
passt.1
4
passt.1
|
@ -149,8 +149,8 @@ This option can be specified zero (for defaults) to two times (once for IPv4,
|
||||||
once for IPv6).
|
once for IPv6).
|
||||||
By default, assigned IPv4 and IPv6 addresses are taken from the host interfaces
|
By default, assigned IPv4 and IPv6 addresses are taken from the host interfaces
|
||||||
with the first default route, if any, for the corresponding IP version. If no
|
with the first default route, if any, for the corresponding IP version. If no
|
||||||
default routes are available and there is just one interface with any route,
|
default routes are available and there is any interface with any route for a
|
||||||
that interface will be chosen instead.
|
given IP version, the first of these interfaces will be chosen instead.
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
.BR \-n ", " \-\-netmask " " \fImask
|
.BR \-n ", " \-\-netmask " " \fImask
|
||||||
|
|
Loading…
Reference in a new issue