diff options
author | KUROSAWA Takahiro <takahiro.kurosawa@gmail.com> | 2023-11-28 18:14:50 +0000 |
---|---|---|
committer | R. Christian McDonald <rcm@FreeBSD.org> | 2023-11-28 21:11:55 +0000 |
commit | f818559774cb0c1516364c4beca361480fd68b5b (patch) | |
tree | 4844ec76ca73f662bec04913cf651b2920730fc7 | |
parent | 2276e53940c2a2bf7c7e9cb705e51de4202258c2 (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.c | 11 |
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); } |