aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKUROSAWA Takahiro <takahiro.kurosawa@gmail.com>2023-11-28 18:14:50 +0000
committerR. Christian McDonald <rcm@FreeBSD.org>2023-11-28 21:11:55 +0000
commitf818559774cb0c1516364c4beca361480fd68b5b (patch)
tree4844ec76ca73f662bec04913cf651b2920730fc7
parent2276e53940c2a2bf7c7e9cb705e51de4202258c2 (diff)
netlink: fix adding an interface route
route add <host> -iface <netif>" for a netif without an IPv4/IPv6 address fails with EINVAL. Need to use a link-level ifaddr for gw if an ifaddr for dst is not found as the rtsock-based implementation does. PR: 275341 Reported by: Sean Cody <sean@tinfoilhat.ca> Reviewed by: rcm Tested by: rcm Approved by: kp (mentor) MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D41330
-rw-r--r--sys/netlink/route/rt.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/sys/netlink/route/rt.c b/sys/netlink/route/rt.c
index cfaa2167b0d2..ed09748995dc 100644
--- a/sys/netlink/route/rt.c
+++ b/sys/netlink/route/rt.c
@@ -750,9 +750,14 @@ finalize_nhop(struct nhop_object *nh, const struct sockaddr *dst, int *perror)
struct ifaddr *ifa = ifaof_ifpforaddr(gw_sa, nh->nh_ifp);
if (ifa == NULL) {
- NL_LOG(LOG_DEBUG, "Unable to determine ifa, skipping");
- *perror = EINVAL;
- return (NULL);
+ /* Try link-level ifa. */
+ gw_sa = &nh->gw_sa;
+ ifa = ifaof_ifpforaddr(gw_sa, nh->nh_ifp);
+ if (ifa == NULL) {
+ NL_LOG(LOG_DEBUG, "Unable to determine ifa, skipping");
+ *perror = EINVAL;
+ return (NULL);
+ }
}
nhop_set_src(nh, ifa);
}