git: 10e097610309 - stable/13 - Simplify nhop operations in ip_output().

Alexander V. Chernikov melifaro at FreeBSD.org
Tue Sep 7 21:12:54 UTC 2021


The branch stable/13 has been updated by melifaro:

URL: https://cgit.FreeBSD.org/src/commit/?id=10e09761030960a435c075e2b1dfd3bff2db7c4c

commit 10e09761030960a435c075e2b1dfd3bff2db7c4c
Author:     Alexander V. Chernikov <melifaro at FreeBSD.org>
AuthorDate: 2021-08-07 11:18:02 +0000
Commit:     Alexander V. Chernikov <melifaro at FreeBSD.org>
CommitDate: 2021-09-07 21:02:58 +0000

    Simplify nhop operations in ip_output().
    
    Consistently use `nh` instead of always dereferencing
     ro->ro_nh inside the if block.
    Always use nexthop mtu, as it provides guarantee that mtu is accurate.
    Pass `nh` pointer to rt_update_ro_flags() to allow upcoming uses
     of updating ro flags based on different nexthop.
    
    Differential Revision: https://reviews.freebsd.org/D31451
    Reviewed by:    kp
    
    (cherry picked from commit 9748eb742791dcfbb6496dc5c7c72c9283759baf)
---
 sys/net/route/route_ctl.c | 21 +++++++++++++++++++--
 sys/netinet/ip_output.c   | 27 +++++++++++++--------------
 2 files changed, 32 insertions(+), 16 deletions(-)

diff --git a/sys/net/route/route_ctl.c b/sys/net/route/route_ctl.c
index 582901d67a8d..a686d1623053 100644
--- a/sys/net/route/route_ctl.c
+++ b/sys/net/route/route_ctl.c
@@ -567,6 +567,24 @@ rib_add_route(uint32_t fibnum, struct rt_addrinfo *info,
 	return (error);
 }
 
+/*
+ * Checks if @dst and @gateway is valid combination.
+ *
+ * Returns true if is valid, false otherwise.
+ */
+static bool
+check_gateway(struct rib_head *rnh, struct sockaddr *dst,
+    struct sockaddr *gateway)
+{
+	if (dst->sa_family == gateway->sa_family)
+		return (true);
+	else if (gateway->sa_family == AF_UNSPEC)
+		return (true);
+	else if (gateway->sa_family == AF_LINK)
+		return (true);
+	return (false);
+}
+
 /*
  * Creates rtentry and nexthop based on @info data.
  * Return 0 and fills in rtentry into @prt on success,
@@ -589,8 +607,7 @@ create_rtentry(struct rib_head *rnh, struct rt_addrinfo *info,
 
 	if ((flags & RTF_GATEWAY) && !gateway)
 		return (EINVAL);
-	if (dst && gateway && (dst->sa_family != gateway->sa_family) && 
-	    (gateway->sa_family != AF_UNSPEC) && (gateway->sa_family != AF_LINK))
+	if (dst && gateway && !check_gateway(rnh, dst, gateway))
 		return (EINVAL);
 
 	if (dst->sa_len > sizeof(((struct rtentry *)NULL)->rt_dstb))
diff --git a/sys/netinet/ip_output.c b/sys/netinet/ip_output.c
index 405490e890c0..13b5cecbfe82 100644
--- a/sys/netinet/ip_output.c
+++ b/sys/netinet/ip_output.c
@@ -292,9 +292,9 @@ done:
 
 /* rte<>ro_flags translation */
 static inline void
-rt_update_ro_flags(struct route *ro)
+rt_update_ro_flags(struct route *ro, const struct nhop_object *nh)
 {
-	int nh_flags = ro->ro_nh->nh_flags;
+	int nh_flags = nh->nh_flags;
 
 	ro->ro_flags &= ~ (RT_REJECT|RT_BLACKHOLE|RT_HAS_GW);
 
@@ -493,22 +493,21 @@ again:
 				goto bad;
 			}
 		}
-		ia = ifatoia(ro->ro_nh->nh_ifa);
-		ifp = ro->ro_nh->nh_ifp;
-		counter_u64_add(ro->ro_nh->nh_pksent, 1);
-		rt_update_ro_flags(ro);
-		if (ro->ro_nh->nh_flags & NHF_GATEWAY)
-			gw = &ro->ro_nh->gw4_sa;
-		if (ro->ro_nh->nh_flags & NHF_HOST)
-			isbroadcast = (ro->ro_nh->nh_flags & NHF_BROADCAST);
+		struct nhop_object *nh = ro->ro_nh;
+
+		ia = ifatoia(nh->nh_ifa);
+		ifp = nh->nh_ifp;
+		counter_u64_add(nh->nh_pksent, 1);
+		rt_update_ro_flags(ro, nh);
+		if (nh->nh_flags & NHF_GATEWAY)
+			gw = &nh->gw4_sa;
+		if (nh->nh_flags & NHF_HOST)
+			isbroadcast = (nh->nh_flags & NHF_BROADCAST);
 		else if (ifp->if_flags & IFF_BROADCAST)
 			isbroadcast = in_ifaddr_broadcast(gw->sin_addr, ia);
 		else
 			isbroadcast = 0;
-		if (ro->ro_nh->nh_flags & NHF_HOST)
-			mtu = ro->ro_nh->nh_mtu;
-		else
-			mtu = ifp->if_mtu;
+		mtu = nh->nh_mtu;
 		src = IA_SIN(ia)->sin_addr;
 	} else {
 		struct nhop_object *nh;


More information about the dev-commits-src-all mailing list