git: f57df4589d3c - stable/13 - Fix failure to add an interface prefix route when route with the same prefix is already presented in the routing table.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sat, 11 Jan 2025 12:35:50 UTC
The branch stable/13 has been updated by eugen:
URL: https://cgit.FreeBSD.org/src/commit/?id=f57df4589d3cd91dac88b2c9edb80ad0eb50979c
commit f57df4589d3cd91dac88b2c9edb80ad0eb50979c
Author: Alexander V. Chernikov <melifaro@FreeBSD.org>
AuthorDate: 2024-11-12 23:36:50 +0000
Commit: Eugene Grosbein <eugen@FreeBSD.org>
CommitDate: 2025-01-11 12:34:48 +0000
Fix failure to add an interface prefix route
when route with the same prefix is already presented
in the routing table.
PR: 277125
Reported by: Oleksandr Ignatyev <alex@i.org.ua>
Reviewed by: ae, jlduran
Tested by: jlduran
Differential Revision: https://reviews.freebsd.org/D47534
(cherry picked from commit 1da4954c92ea7585b352ba830d3ee64ca69ada52)
---
sys/net/route/route_ctl.c | 13 ++++++++-----
sys/net/route/route_ctl.h | 10 +++++-----
2 files changed, 13 insertions(+), 10 deletions(-)
diff --git a/sys/net/route/route_ctl.c b/sys/net/route/route_ctl.c
index 75e4be5e9a5c..fd09998d4a01 100644
--- a/sys/net/route/route_ctl.c
+++ b/sys/net/route/route_ctl.c
@@ -757,12 +757,15 @@ add_route_byinfo(struct rib_head *rnh, struct rt_addrinfo *info,
rnd_add.rnd_weight = get_info_weight(info, RT_DEFAULT_WEIGHT);
int op_flags = RTM_F_CREATE;
- if (get_prio_from_info(info) == NH_PRIORITY_HIGH)
- op_flags |= RTM_F_FORCE;
- else
- op_flags |= RTM_F_APPEND;
- return (add_route_flags(rnh, rt, &rnd_add, op_flags, rc));
+ /*
+ * Set the desired action when the route already exists:
+ * If RTF_PINNED is present, assume the direct kernel routes that cannot be multipath.
+ * Otherwise, append the path.
+ */
+ op_flags |= (info->rti_flags & RTF_PINNED) ? RTM_F_REPLACE : RTM_F_APPEND;
+
+ return (add_route_flags(rnh, rt, &rnd_add, op_flags, rc));
}
static int
diff --git a/sys/net/route/route_ctl.h b/sys/net/route/route_ctl.h
index 8591f36fbbe1..aea7d2d04a0d 100644
--- a/sys/net/route/route_ctl.h
+++ b/sys/net/route/route_ctl.h
@@ -59,11 +59,11 @@ int rib_del_route_px_gw(uint32_t fibnum, struct sockaddr *dst, int plen,
const struct sockaddr *gw, int op_flags, struct rib_cmd_info *rc);
/* operation flags */
-#define RTM_F_CREATE 0x01
-#define RTM_F_EXCL 0x02
-#define RTM_F_REPLACE 0x04
-#define RTM_F_APPEND 0x08
-#define RTM_F_FORCE 0x10
+#define RTM_F_CREATE 0x01 /* Create object if not exists */
+#define RTM_F_EXCL 0x02 /* (Deprecated) Do not replace or append if exists */
+#define RTM_F_REPLACE 0x04 /* Replace if route (even multipath) if exists */
+#define RTM_F_APPEND 0x08 /* Append path to the route */
+#define RTM_F_FORCE 0x10 /* Bump operation priority to highest */
int rib_add_route(uint32_t fibnum, struct rt_addrinfo *info,
struct rib_cmd_info *rc);