Fix ADD/REPLACE semantic for IPv4 and IPv6 routes: if NLM_F_REPLACE is set, call fib_table_entry_update(); otherwise call fib_table_entry_path_add2()

This commit is contained in:
Pim van Pelt
2023-05-21 09:11:05 +02:00
parent bc429011e8
commit 529a11bb78
3 changed files with 15 additions and 9 deletions

View File

@ -225,8 +225,13 @@ lcp_nl_dispatch (struct nl_object *obj, void *arg)
lcp_nl_link_del ((struct rtnl_link *) obj); lcp_nl_link_del ((struct rtnl_link *) obj);
break; break;
case RTM_NEWROUTE: case RTM_NEWROUTE:
lcp_nl_route_add ((struct rtnl_route *) obj); {
break; nl_msg_info_t *msg_info = (nl_msg_info_t *) arg;
struct nlmsghdr *nlh = nlmsg_hdr (msg_info->msg);
lcp_nl_route_add ((struct rtnl_route *) obj,
(nlh->nlmsg_flags & NLM_F_REPLACE));
break;
}
case RTM_DELROUTE: case RTM_DELROUTE:
lcp_nl_route_del ((struct rtnl_route *) obj); lcp_nl_route_del ((struct rtnl_route *) obj);
break; break;

View File

@ -118,7 +118,7 @@ void lcp_nl_addr_add (struct rtnl_addr *ra);
void lcp_nl_addr_del (struct rtnl_addr *ra); void lcp_nl_addr_del (struct rtnl_addr *ra);
void lcp_nl_link_add (struct rtnl_link *rl, void *ctx); void lcp_nl_link_add (struct rtnl_link *rl, void *ctx);
void lcp_nl_link_del (struct rtnl_link *rl); void lcp_nl_link_del (struct rtnl_link *rl);
void lcp_nl_route_add (struct rtnl_route *rr); void lcp_nl_route_add (struct rtnl_route *rr, int is_replace);
void lcp_nl_route_del (struct rtnl_route *rr); void lcp_nl_route_del (struct rtnl_route *rr);
/* /*

View File

@ -451,7 +451,7 @@ lcp_nl_route_del (struct rtnl_route *rr)
} }
void void
lcp_nl_route_add (struct rtnl_route *rr) lcp_nl_route_add (struct rtnl_route *rr, int is_replace)
{ {
fib_entry_flag_t entry_flags; fib_entry_flag_t entry_flags;
uint32_t table_id; uint32_t table_id;
@ -459,7 +459,8 @@ lcp_nl_route_add (struct rtnl_route *rr)
lcp_nl_table_t *nlt; lcp_nl_table_t *nlt;
uint8_t rtype, rproto; uint8_t rtype, rproto;
LCP_NL_DBG ("route_add: netlink %U", format_nl_object, rr); LCP_NL_DBG ("route_add: netlink %U %s", format_nl_object, rr,
is_replace?"replace":"");
rtype = rtnl_route_get_type (rr); rtype = rtnl_route_get_type (rr);
table_id = rtnl_route_get_table (rr); table_id = rtnl_route_get_table (rr);
@ -534,12 +535,12 @@ lcp_nl_route_add (struct rtnl_route *rr)
rtnl_route_get_table (rr), format_fib_prefix, &pfx, rtnl_route_get_table (rr), format_fib_prefix, &pfx,
format_fib_entry_flags, entry_flags); format_fib_entry_flags, entry_flags);
if (pfx.fp_proto == FIB_PROTOCOL_IP6) if (is_replace)
fib_table_entry_path_add2 (nlt->nlt_fib_index, &pfx, fib_src,
entry_flags, np.paths);
else
fib_table_entry_update (nlt->nlt_fib_index, &pfx, fib_src, fib_table_entry_update (nlt->nlt_fib_index, &pfx, fib_src,
entry_flags, np.paths); entry_flags, np.paths);
else
fib_table_entry_path_add2 (nlt->nlt_fib_index, &pfx, fib_src,
entry_flags, np.paths);
} }
} }
else else