aboutgitcodebugslistschat
path: root/netlink.c
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2024-03-21 15:04:49 +1100
committerStefano Brivio <sbrivio@redhat.com>2024-04-05 16:59:08 +0200
commit97e8b33f8708dea4d5666e4612c0377eb158b470 (patch)
treefc706f2fe0c82aeb2bded3561a60ec92a3d844ae /netlink.c
parent67a62589185f947a8757528818e090f9ae264738 (diff)
downloadpasst-97e8b33f8708dea4d5666e4612c0377eb158b470.tar
passt-97e8b33f8708dea4d5666e4612c0377eb158b470.tar.gz
passt-97e8b33f8708dea4d5666e4612c0377eb158b470.tar.bz2
passt-97e8b33f8708dea4d5666e4612c0377eb158b470.tar.lz
passt-97e8b33f8708dea4d5666e4612c0377eb158b470.tar.xz
passt-97e8b33f8708dea4d5666e4612c0377eb158b470.tar.zst
passt-97e8b33f8708dea4d5666e4612c0377eb158b470.zip
netlink: Ignore routes to link-local addresses for selecting interface
Since f919dc7a4b1c ("conf, netlink: Don't require a default route to start"), and since 639fdf06ede ("netlink: Fix selection of template interface") less buggily, we haven't required a default route on the host in order to operate. Instead, if we lack a default route we'll pick an interface with any route, as long as there's only one such interface. If there's more than one, we don't have a good criterion to pick, so we give up with an informational message. Paul Holzinger pointed out that this code considers it ambiguous even if all but one of the interfaces has only routes to link-local addresses (fe80::/10). A route to link-local addresses isn't really useful from pasta's point of view, so ignore them instead. This removes a misleading message in many cases, and a spurious failure in some cases. Suggested-by: Paul Holzinger <pholzing@redhat.com> Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Diffstat (limited to 'netlink.c')
-rw-r--r--netlink.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/netlink.c b/netlink.c
index 0549237..89c0641 100644
--- a/netlink.c
+++ b/netlink.c
@@ -33,6 +33,7 @@
#include "util.h"
#include "passt.h"
#include "log.h"
+#include "ip.h"
#include "netlink.h"
/* Netlink expects a buffer of at least 8kiB or the system page size,
@@ -270,6 +271,7 @@ unsigned int nl_get_ext_if(int s, sa_family_t af)
seq = nl_send(s, &req, RTM_GETROUTE, NLM_F_DUMP, sizeof(req));
nl_foreach_oftype(nh, status, s, buf, seq, RTM_NEWROUTE) {
struct rtmsg *rtm = (struct rtmsg *)NLMSG_DATA(nh);
+ const void *dst = NULL;
unsigned thisifi = 0;
if (rtm->rtm_family != af)
@@ -284,12 +286,23 @@ unsigned int nl_get_ext_if(int s, sa_family_t af)
rtnh = (struct rtnexthop *)RTA_DATA(rta);
thisifi = rtnh->rtnh_ifindex;
+ } else if (rta->rta_type == RTA_DST) {
+ dst = RTA_DATA(rta);
}
}
if (!thisifi)
continue; /* No interface for this route */
+ /* Skip routes to link-local addresses */
+ if (af == AF_INET && dst &&
+ IN4_IS_PREFIX_LINKLOCAL(dst, rtm->rtm_dst_len))
+ continue;
+
+ if (af == AF_INET6 && dst &&
+ IN6_IS_PREFIX_LINKLOCAL(dst, rtm->rtm_dst_len))
+ continue;
+
if (rtm->rtm_dst_len == 0) {
/* Default route */
ndef++;
@@ -322,7 +335,7 @@ unsigned int nl_get_ext_if(int s, sa_family_t af)
}
if (!nany)
- info("No interfaces with %s routes", af_name(af));
+ info("No interfaces with usable %s routes", af_name(af));
return 0;
}