summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorChristian Weisgerber <naddy@cvs.openbsd.org>2024-02-29 12:02:00 +0000
committerChristian Weisgerber <naddy@cvs.openbsd.org>2024-02-29 12:02:00 +0000
commit27542f42eb55c557e4fec4f7be54e2a4b2afe5f4 (patch)
tree871a2fd1e548f9181e02d42324d4fa4b08d6e660 /sys
parentfce5b79788a00f1b2c0e064e3ed47433c0db5d82 (diff)
revert "Combine route_cache() and rtalloc_mpath() in new route_mpath()"
It breaks NFS. ok claudio@
Diffstat (limited to 'sys')
-rw-r--r--sys/net/route.c42
-rw-r--r--sys/net/route.h6
-rw-r--r--sys/netinet/in_pcb.c28
-rw-r--r--sys/netinet6/in6_pcb.c12
-rw-r--r--sys/netinet6/in6_src.c43
5 files changed, 56 insertions, 75 deletions
diff --git a/sys/net/route.c b/sys/net/route.c
index ffc87f6e985..9dadb5aa5eb 100644
--- a/sys/net/route.c
+++ b/sys/net/route.c
@@ -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
/*
diff --git a/sys/net/route.h b/sys/net/route.h
index 6a7ee94e644..c05a70d0636 100644
--- a/sys/net/route.h
+++ b/sys/net/route.h
@@ -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 *);
diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c
index 8135144c96b..610b91d11bb 100644
--- a/sys/netinet/in_pcb.c
+++ b/sys/netinet/in_pcb.c
@@ -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;
diff --git a/sys/netinet6/in6_pcb.c b/sys/netinet6/in6_pcb.c
index c678bbf5696..ac10047a6f3 100644
--- a/sys/netinet6/in6_pcb.c
+++ b/sys/netinet6/in6_pcb.c
@@ -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 *
diff --git a/sys/netinet6/in6_src.c b/sys/netinet6/in6_src.c
index 145a1c11a1c..2ebfdb9d465 100644
--- a/sys/netinet6/in6_src.c
+++ b/sys/netinet6/in6_src.c
@@ -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);
}