Fix source address selection on unbound sockets in the presence of multiple
fibs. Use the mbuf's or the socket's fib instead of RT_ALL_FIBS. Fixes PR 187553. Also fixes netperf's UDP_STREAM test on a nondefault fib. sys/netinet/ip_output.c In ip_output, lookup the source address using the mbuf's fib instead of RT_ALL_FIBS. sys/netinet/in_pcb.c in in_pcbladdr, lookup the source address using the socket's fib, because we don't seem to have the mbuf fib. They should be the same, though. tests/sys/net/fibs_test.sh Clear the expected failure on udp_dontroute. PR: 187553 CR: https://reviews.freebsd.org/D772 MFC after: 3 weeks Sponsored by: Spectra Logic
This commit is contained in:
parent
b60b0fe6fd
commit
58a39d8c5b
@ -793,10 +793,10 @@ in_pcbladdr(struct inpcb *inp, struct in_addr *faddr, struct in_addr *laddr,
|
||||
struct ifnet *ifp;
|
||||
|
||||
ia = ifatoia(ifa_ifwithdstaddr((struct sockaddr *)sin,
|
||||
RT_ALL_FIBS));
|
||||
inp->inp_socket->so_fibnum));
|
||||
if (ia == NULL)
|
||||
ia = ifatoia(ifa_ifwithnet((struct sockaddr *)sin, 0,
|
||||
RT_ALL_FIBS));
|
||||
inp->inp_socket->so_fibnum));
|
||||
if (ia == NULL) {
|
||||
error = ENETUNREACH;
|
||||
goto done;
|
||||
@ -911,10 +911,11 @@ in_pcbladdr(struct inpcb *inp, struct in_addr *faddr, struct in_addr *laddr,
|
||||
sain.sin_len = sizeof(struct sockaddr_in);
|
||||
sain.sin_addr.s_addr = faddr->s_addr;
|
||||
|
||||
ia = ifatoia(ifa_ifwithdstaddr(sintosa(&sain), RT_ALL_FIBS));
|
||||
ia = ifatoia(ifa_ifwithdstaddr(sintosa(&sain),
|
||||
inp->inp_socket->so_fibnum));
|
||||
if (ia == NULL)
|
||||
ia = ifatoia(ifa_ifwithnet(sintosa(&sain), 0,
|
||||
RT_ALL_FIBS));
|
||||
inp->inp_socket->so_fibnum));
|
||||
if (ia == NULL)
|
||||
ia = ifatoia(ifa_ifwithaddr(sintosa(&sain)));
|
||||
|
||||
|
@ -236,9 +236,9 @@ ip_output(struct mbuf *m, struct mbuf *opt, struct route *ro, int flags,
|
||||
*/
|
||||
if (flags & IP_SENDONES) {
|
||||
if ((ia = ifatoia(ifa_ifwithbroadaddr(sintosa(dst),
|
||||
RT_ALL_FIBS))) == NULL &&
|
||||
M_GETFIB(m)))) == NULL &&
|
||||
(ia = ifatoia(ifa_ifwithdstaddr(sintosa(dst),
|
||||
RT_ALL_FIBS))) == NULL) {
|
||||
M_GETFIB(m)))) == NULL) {
|
||||
IPSTAT_INC(ips_noroute);
|
||||
error = ENETUNREACH;
|
||||
goto bad;
|
||||
@ -251,9 +251,9 @@ ip_output(struct mbuf *m, struct mbuf *opt, struct route *ro, int flags,
|
||||
isbroadcast = 1;
|
||||
} else if (flags & IP_ROUTETOIF) {
|
||||
if ((ia = ifatoia(ifa_ifwithdstaddr(sintosa(dst),
|
||||
RT_ALL_FIBS))) == NULL &&
|
||||
M_GETFIB(m)))) == NULL &&
|
||||
(ia = ifatoia(ifa_ifwithnet(sintosa(dst), 0,
|
||||
RT_ALL_FIBS))) == NULL) {
|
||||
M_GETFIB(m)))) == NULL) {
|
||||
IPSTAT_INC(ips_noroute);
|
||||
error = ENETUNREACH;
|
||||
goto bad;
|
||||
|
@ -366,7 +366,6 @@ udp_dontroute_head()
|
||||
|
||||
udp_dontroute_body()
|
||||
{
|
||||
atf_expect_fail "kern/187553 Source address selection for UDP packets with SO_DONTROUTE uses the default FIB"
|
||||
# Configure the TAP interface to use an RFC5737 nonrouteable address
|
||||
# and a non-default fib
|
||||
ADDR0="192.0.2.2"
|
||||
|
Loading…
Reference in New Issue
Block a user