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
This commit is contained in:
KUROSAWA Takahiro 2023-11-28 13:14:50 -05:00 committed by R. Christian McDonald
parent 2276e53940
commit f818559774
No known key found for this signature in database
GPG key ID: A2C377A70FBB25ED

View file

@ -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);
}