Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 17 Feb 2023 18:16:42 GMT
From:      "Alexander V. Chernikov" <melifaro@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: a0aa160b6d26 - main - routing: always pass rtentry to add_route_flags().
Message-ID:  <202302171816.31HIGg18054294@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by melifaro:

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

commit a0aa160b6d261f67b29a25c7cc5e04668fb6faf7
Author:     Alexander V. Chernikov <melifaro@FreeBSD.org>
AuthorDate: 2023-02-17 17:20:38 +0000
Commit:     Alexander V. Chernikov <melifaro@FreeBSD.org>
CommitDate: 2023-02-17 18:00:37 +0000

    routing: always pass rtentry to add_route_flags().
    
    add_route_flags() uses `rt` prefix data to lookup the the current
     rtentry from the routing table. Update rib_add_route_px() to
     always pass rtentry regardless of the op_flags.
    
    Reported by:    Stefan Grundmann <sg2342@googlemail.com>
    MFC after:      1 day
---
 sys/net/route/route_ctl.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/sys/net/route/route_ctl.c b/sys/net/route/route_ctl.c
index fd374b468b7c..755765869e84 100644
--- a/sys/net/route/route_ctl.c
+++ b/sys/net/route/route_ctl.c
@@ -455,7 +455,7 @@ fill_pxmask_family(int family, int plen, struct sockaddr *_dst,
  * Attempts to add @dst/plen prefix with nexthop/nexhopgroup data @rnd
  * to the routing table.
  *
- * @fibnum: rtable id to insert route to
+ * @fibnum: verified kernel rtable id to insert route to
  * @dst: verified kernel-originated sockaddr, can be masked if plen non-empty
  * @plen: prefix length (or -1 if host route or not applicable for AF)
  * @op_flags: combination of RTM_F_ flags
@@ -490,6 +490,16 @@ rib_add_route_px(uint32_t fibnum, struct sockaddr *dst, int plen,
 			FIB_RH_LOG(LOG_INFO, rnh, "rtentry allocation failed");
 			return (ENOMEM);
 		}
+	} else {
+		struct route_nhop_data rnd_tmp;
+		RIB_RLOCK_TRACKER;
+
+		RIB_RLOCK(rnh);
+		rt = lookup_prefix_bysa(rnh, dst, netmask, &rnd_tmp);
+		RIB_RUNLOCK(rnh);
+
+		if (rt == NULL)
+			return (ESRCH);
 	}
 
 	return (add_route_flags(rnh, rt, rnd, op_flags, rc));
@@ -766,6 +776,8 @@ add_route_flags(struct rib_head *rnh, struct rtentry *rt, struct route_nhop_data
 	struct rtentry *rt_orig;
 	int error = 0;
 
+	MPASS(rt != NULL);
+
 	nh = rnd_add->rnd_nhop;
 
 	RIB_WLOCK(rnh);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202302171816.31HIGg18054294>