1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-26 11:47:31 +00:00

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
MFC after:	2 weeks
This commit is contained in:
Alexander V. Chernikov 2024-11-12 23:36:50 +00:00
parent ac5e30a807
commit 1da4954c92
2 changed files with 13 additions and 10 deletions

View File

@ -772,12 +772,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

View File

@ -61,11 +61,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);