revert "Combine route_cache() and rtalloc_mpath() in new route_mpath()"
authornaddy <naddy@openbsd.org>
Thu, 29 Feb 2024 12:01:59 +0000 (12:01 +0000)
committernaddy <naddy@openbsd.org>
Thu, 29 Feb 2024 12:01:59 +0000 (12:01 +0000)
It breaks NFS.

ok claudio@

sys/net/route.c
sys/net/route.h
sys/netinet/in_pcb.c
sys/netinet6/in6_pcb.c
sys/netinet6/in6_src.c

index ffc87f6..9dadb5a 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: route.c,v 1.434 2024/02/27 12:37:49 bluhm Exp $       */
+/*     $OpenBSD: route.c,v 1.435 2024/02/29 12:01:59 naddy Exp $       */
 /*     $NetBSD: route.c,v 1.14 1996/02/13 22:00:46 christos Exp $      */
 
 /*
@@ -239,28 +239,6 @@ route_cache(struct route *ro, const struct in_addr *dst,
        return (ESRCH);
 }
 
-/*
- * Check cache for route, else allocate a new one, potentially using multipath
- * to select the peer.  Update cache and return valid route or NULL.
- */
-struct rtentry *
-route_mpath(struct route *ro, const struct in_addr *dst,
-    const struct in_addr *src, u_int rtableid)
-{
-       if (route_cache(ro, dst, src, rtableid)) {
-               uint32_t *s = NULL;
-
-               if (ro->ro_srcin.s_addr != INADDR_ANY)
-                       s = &ro->ro_srcin.s_addr;
-               ro->ro_rt = rtalloc_mpath(&ro->ro_dstsa, s, ro->ro_tableid);
-               if (!rtisvalid(ro->ro_rt)) {
-                       rtfree(ro->ro_rt);
-                       ro->ro_rt = NULL;
-               }
-       }
-       return (ro->ro_rt);
-}
-
 #ifdef INET6
 int
 route6_cache(struct route *ro, const struct in6_addr *dst,
@@ -299,24 +277,6 @@ route6_cache(struct route *ro, const struct in6_addr *dst,
 
        return (ESRCH);
 }
-
-struct rtentry *
-route6_mpath(struct route *ro, const struct in6_addr *dst,
-    const struct in6_addr *src, u_int rtableid)
-{
-       if (route6_cache(ro, dst, src, rtableid)) {
-               uint32_t *s = NULL;
-
-               if (!IN6_IS_ADDR_UNSPECIFIED(&ro->ro_srcin6))
-                       s = &ro->ro_srcin6.s6_addr32[0];
-               ro->ro_rt = rtalloc_mpath(&ro->ro_dstsa, s, ro->ro_tableid);
-               if (!rtisvalid(ro->ro_rt)) {
-                       rtfree(ro->ro_rt);
-                       ro->ro_rt = NULL;
-               }
-       }
-       return (ro->ro_rt);
-}
 #endif
 
 /*
index 6a7ee94..c05a70d 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: route.h,v 1.208 2024/02/27 12:37:49 bluhm Exp $       */
+/*     $OpenBSD: route.h,v 1.209 2024/02/29 12:01:59 naddy Exp $       */
 /*     $NetBSD: route.h,v 1.9 1996/02/13 22:00:49 christos Exp $       */
 
 /*
@@ -465,12 +465,8 @@ struct bfd_config;
 void    route_init(void);
 int     route_cache(struct route *, const struct in_addr *,
            const struct in_addr *, u_int);
-struct rtentry *route_mpath(struct route *, const struct in_addr *,
-           const struct in_addr *, u_int);
 int     route6_cache(struct route *, const struct in6_addr *,
            const struct in6_addr *, u_int);
-struct rtentry *route6_mpath(struct route *, const struct in6_addr *,
-           const struct in6_addr *, u_int);
 void    rtm_ifchg(struct ifnet *);
 void    rtm_ifannounce(struct ifnet *, int);
 void    rtm_bfd(struct bfd_config *);
index 8135144..610b91d 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: in_pcb.c,v 1.295 2024/02/27 12:37:49 bluhm Exp $      */
+/*     $OpenBSD: in_pcb.c,v 1.296 2024/02/29 12:01:59 naddy Exp $      */
 /*     $NetBSD: in_pcb.c,v 1.25 1996/02/13 23:41:53 christos Exp $     */
 
 /*
@@ -908,15 +908,23 @@ in_pcblookup_local_lock(struct inpcbtable *table, const void *laddrp,
 struct rtentry *
 in_pcbrtentry(struct inpcb *inp)
 {
+       struct route *ro;
+
 #ifdef INET6
        if (ISSET(inp->inp_flags, INP_IPV6))
                return in6_pcbrtentry(inp);
 #endif
 
+       ro = &inp->inp_route;
+
        if (inp->inp_faddr.s_addr == INADDR_ANY)
                return (NULL);
-       return (route_mpath(&inp->inp_route, &inp->inp_faddr, &inp->inp_laddr,
-           inp->inp_rtableid));
+       if (route_cache(ro, &inp->inp_faddr, &inp->inp_laddr,
+           inp->inp_rtableid)) {
+               ro->ro_rt = rtalloc_mpath(&ro->ro_dstsa,
+                   &inp->inp_laddr.s_addr, ro->ro_tableid);
+       }
+       return (ro->ro_rt);
 }
 
 /*
@@ -930,7 +938,7 @@ in_pcbselsrc(struct in_addr *insrc, struct sockaddr_in *sin,
     struct inpcb *inp)
 {
        struct ip_moptions *mopts = inp->inp_moptions;
-       struct rtentry *rt;
+       struct route *ro = &inp->inp_route;
        const struct in_addr *laddr = &inp->inp_laddr;
        u_int rtableid = inp->inp_rtableid;
        struct sockaddr *ip4_source = NULL;
@@ -975,14 +983,17 @@ in_pcbselsrc(struct in_addr *insrc, struct sockaddr_in *sin,
         * If route is known or can be allocated now,
         * our src addr is taken from the i/f, else punt.
         */
-       rt = route_mpath(&inp->inp_route, &sin->sin_addr, NULL, rtableid);
+       if (route_cache(ro, &sin->sin_addr, NULL, rtableid)) {
+               /* No route yet, so try to acquire one */
+               ro->ro_rt = rtalloc_mpath(&ro->ro_dstsa, NULL, ro->ro_tableid);
+       }
 
        /*
         * If we found a route, use the address
         * corresponding to the outgoing interface.
         */
-       if (rt != NULL)
-               ia = ifatoia(rt->rt_ifa);
+       if (ro->ro_rt != NULL)
+               ia = ifatoia(ro->ro_rt->rt_ifa);
 
        /*
         * Use preferred source address if :
@@ -990,7 +1001,8 @@ in_pcbselsrc(struct in_addr *insrc, struct sockaddr_in *sin,
         * - preferred source address is set
         * - output interface is UP
         */
-       if (rt && !(rt->rt_flags & RTF_LLINFO) && !(rt->rt_flags & RTF_HOST)) {
+       if (ro->ro_rt && !(ro->ro_rt->rt_flags & RTF_LLINFO) &&
+           !(ro->ro_rt->rt_flags & RTF_HOST)) {
                ip4_source = rtable_getsource(rtableid, AF_INET);
                if (ip4_source != NULL) {
                        struct ifaddr *ifa;
index c678bbf..ac10047 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: in6_pcb.c,v 1.140 2024/02/27 12:37:49 bluhm Exp $     */
+/*     $OpenBSD: in6_pcb.c,v 1.141 2024/02/29 12:01:59 naddy Exp $     */
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -561,10 +561,16 @@ in6_pcbnotify(struct inpcbtable *table, const struct sockaddr_in6 *dst,
 struct rtentry *
 in6_pcbrtentry(struct inpcb *inp)
 {
+       struct route *ro = &inp->inp_route;
+
        if (IN6_IS_ADDR_UNSPECIFIED(&inp->inp_faddr6))
                return (NULL);
-       return (route6_mpath(&inp->inp_route, &inp->inp_faddr6,
-           &inp->inp_laddr6, inp->inp_rtableid));
+       if (route6_cache(ro, &inp->inp_faddr6, &inp->inp_laddr6,
+           inp->inp_rtableid)) {
+               ro->ro_rt = rtalloc_mpath(&ro->ro_dstsa,
+                   &inp->inp_laddr6.s6_addr32[0], ro->ro_tableid);
+       }
+       return (ro->ro_rt);
 }
 
 struct inpcb *
index 145a1c1..2ebfdb9 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: in6_src.c,v 1.96 2024/02/27 12:37:49 bluhm Exp $      */
+/*     $OpenBSD: in6_src.c,v 1.97 2024/02/29 12:01:59 naddy Exp $      */
 /*     $KAME: in6_src.c,v 1.36 2001/02/06 04:08:17 itojun Exp $        */
 
 /*
@@ -95,7 +95,7 @@ in6_pcbselsrc(const struct in6_addr **in6src, struct sockaddr_in6 *dstsock,
     struct inpcb *inp, struct ip6_pktopts *opts)
 {
        struct ip6_moptions *mopts = inp->inp_moptions6;
-       struct rtentry *rt;
+       struct route *ro = &inp->inp_route;
        const struct in6_addr *laddr = &inp->inp_laddr6;
        u_int rtableid = inp->inp_rtableid;
        struct ifnet *ifp = NULL;
@@ -118,8 +118,7 @@ in6_pcbselsrc(const struct in6_addr **in6src, struct sockaddr_in6 *dstsock,
                struct sockaddr_in6 sa6;
 
                /* get the outgoing interface */
-               error = in6_selectif(dst, opts, mopts, &inp->inp_route, &ifp,
-                   rtableid);
+               error = in6_selectif(dst, opts, mopts, ro, &ifp, rtableid);
                if (error)
                        return (error);
 
@@ -180,7 +179,9 @@ in6_pcbselsrc(const struct in6_addr **in6src, struct sockaddr_in6 *dstsock,
         * If route is known or can be allocated now,
         * our src addr is taken from the i/f, else punt.
         */
-       rt = route6_mpath(&inp->inp_route, dst, NULL, rtableid);
+       if (route6_cache(ro, dst, NULL, rtableid)) {
+               ro->ro_rt = rtalloc_mpath(&ro->ro_dstsa, NULL, ro->ro_tableid);
+       }
 
        /*
         * in_pcbconnect() checks out IFF_LOOPBACK to skip using
@@ -189,14 +190,14 @@ in6_pcbselsrc(const struct in6_addr **in6src, struct sockaddr_in6 *dstsock,
         * so doesn't check out IFF_LOOPBACK.
         */
 
-       if (rt != NULL) {
-               ifp = if_get(rt->rt_ifidx);
+       if (ro->ro_rt) {
+               ifp = if_get(ro->ro_rt->rt_ifidx);
                if (ifp != NULL) {
                        ia6 = in6_ifawithscope(ifp, dst, rtableid);
                        if_put(ifp);
                }
                if (ia6 == NULL) /* xxx scope error ?*/
-                       ia6 = ifatoia6(rt->rt_ifa);
+                       ia6 = ifatoia6(ro->ro_rt->rt_ifa);
        }
 
        /*
@@ -205,7 +206,8 @@ in6_pcbselsrc(const struct in6_addr **in6src, struct sockaddr_in6 *dstsock,
         * - preferred source address is set
         * - output interface is UP
         */
-       if (rt && !(rt->rt_flags & RTF_LLINFO) && !(rt->rt_flags & RTF_HOST)) {
+       if (ro->ro_rt && !(ro->ro_rt->rt_flags & RTF_LLINFO) &&
+           !(ro->ro_rt->rt_flags & RTF_HOST)) {
                ip6_source = rtable_getsource(rtableid, AF_INET6);
                if (ip6_source != NULL) {
                        struct ifaddr *ifa;
@@ -302,9 +304,11 @@ in6_selectroute(const struct in6_addr *dst, struct ip6_pktopts *opts,
         * a new one.
         */
        if (ro) {
-               struct rtentry *rt;
-
-               rt = route6_mpath(ro, dst, NULL, rtableid);
+               if (route6_cache(ro, dst, NULL, rtableid)) {
+                       /* No route yet, so try to acquire one */
+                       ro->ro_rt = rtalloc_mpath(&ro->ro_dstsa, NULL,
+                           ro->ro_tableid);
+               }
 
                /*
                 * Check if the outgoing interface conflicts with
@@ -315,13 +319,15 @@ in6_selectroute(const struct in6_addr *dst, struct ip6_pktopts *opts,
                 */
                if (opts && opts->ip6po_pktinfo &&
                    opts->ip6po_pktinfo->ipi6_ifindex) {
-                       if (rt != NULL && !ISSET(rt->rt_flags, RTF_LOCAL) &&
-                           rt->rt_ifidx != opts->ip6po_pktinfo->ipi6_ifindex) {
+                       if (ro->ro_rt != NULL &&
+                           !ISSET(ro->ro_rt->rt_flags, RTF_LOCAL) &&
+                           ro->ro_rt->rt_ifidx !=
+                           opts->ip6po_pktinfo->ipi6_ifindex) {
                                return (NULL);
                        }
                }
 
-               return (rt);
+               return (ro->ro_rt);
        }
 
        return (NULL);
@@ -332,7 +338,7 @@ in6_selectif(const struct in6_addr *dst, struct ip6_pktopts *opts,
     struct ip6_moptions *mopts, struct route *ro, struct ifnet **retifp,
     u_int rtableid)
 {
-       struct rtentry *rt;
+       struct rtentry *rt = NULL;
        struct in6_pktinfo *pi = NULL;
 
        /* If the caller specify the outgoing interface explicitly, use it. */
@@ -371,10 +377,11 @@ in6_selectif(const struct in6_addr *dst, struct ip6_pktopts *opts,
         * Although this may not be very harmful, it should still be confusing.
         * We thus reject the case here.
         */
-       if (ISSET(rt->rt_flags, RTF_REJECT | RTF_BLACKHOLE))
+       if (rt && (rt->rt_flags & (RTF_REJECT | RTF_BLACKHOLE)))
                return (rt->rt_flags & RTF_HOST ? EHOSTUNREACH : ENETUNREACH);
 
-       *retifp = if_get(rt->rt_ifidx);
+       if (rt != NULL)
+               *retifp = if_get(rt->rt_ifidx);
 
        return (0);
 }