Author: asomers
Date: Tue Sep 16 15:28:19 2014
New Revision: 271675
URL: http://svnweb.freebsd.org/changeset/base/271675

Log:
  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

Modified:
  head/sys/netinet/in_pcb.c
  head/sys/netinet/ip_output.c
  head/tests/sys/netinet/fibs_test.sh

Modified: head/sys/netinet/in_pcb.c
==============================================================================
--- head/sys/netinet/in_pcb.c   Tue Sep 16 14:39:24 2014        (r271674)
+++ head/sys/netinet/in_pcb.c   Tue Sep 16 15:28:19 2014        (r271675)
@@ -793,10 +793,10 @@ in_pcbladdr(struct inpcb *inp, struct in
                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
                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)));
 

Modified: head/sys/netinet/ip_output.c
==============================================================================
--- head/sys/netinet/ip_output.c        Tue Sep 16 14:39:24 2014        
(r271674)
+++ head/sys/netinet/ip_output.c        Tue Sep 16 15:28:19 2014        
(r271675)
@@ -236,9 +236,9 @@ again:
         */
        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 @@ again:
                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;

Modified: head/tests/sys/netinet/fibs_test.sh
==============================================================================
--- head/tests/sys/netinet/fibs_test.sh Tue Sep 16 14:39:24 2014        
(r271674)
+++ head/tests/sys/netinet/fibs_test.sh Tue Sep 16 15:28:19 2014        
(r271675)
@@ -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"
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to