summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@nvidia.com>2024-10-25 21:56:14 -0400
committerDonald Sharp <sharpd@nvidia.com>2024-10-28 15:02:39 -0400
commit3bff65abc75e952a15b98666e7271189ac28a2bc (patch)
tree0a15c84a931f5b5a84e19fd338df7c4e4f1f39f0
parent811168ecc3850a159fc22beaf30e42be63111413 (diff)
zebra: When installing a mroute, allow it to flow
Currently the mroute code was not allowing the mroute to be sent to the dataplane. This leaves us with a situation where the routes being installed where never being set as installed and additionally nht against the mrib would not work if the route came into existence after the nexthop tracking was asked for. Turns out all the pieces where there to let this work. Modify the code to pass it to the dplane and to send it back up as having worked. Signed-off-by: Donald Sharp <sharpd@nvidia.com>
-rw-r--r--zebra/dplane_fpm_nl.c12
-rw-r--r--zebra/rt_netlink.c3
-rw-r--r--zebra/rt_socket.c8
-rw-r--r--zebra/zebra_rib.c16
4 files changed, 18 insertions, 21 deletions
diff --git a/zebra/dplane_fpm_nl.c b/zebra/dplane_fpm_nl.c
index 8a967978cb..e6b4af3674 100644
--- a/zebra/dplane_fpm_nl.c
+++ b/zebra/dplane_fpm_nl.c
@@ -1712,6 +1712,16 @@ static int fpm_nl_process(struct zebra_dplane_provider *prov)
* anyway.
*/
if (fnc->socket != -1 && fnc->connecting == false) {
+ enum dplane_op_e op = dplane_ctx_get_op(ctx);
+
+ /*
+ * Just skip multicast routes and let them flow through
+ */
+ if ((op == DPLANE_OP_ROUTE_DELETE || op == DPLANE_OP_ROUTE_INSTALL ||
+ op == DPLANE_OP_ROUTE_UPDATE) &&
+ dplane_ctx_get_safi(ctx) == SAFI_MULTICAST)
+ goto skip;
+
frr_with_mutex (&fnc->ctxqueue_mutex) {
dplane_ctx_enqueue_tail(&fnc->ctxqueue, ctx);
cur_queue =
@@ -1722,7 +1732,7 @@ static int fpm_nl_process(struct zebra_dplane_provider *prov)
peak_queue = cur_queue;
continue;
}
-
+skip:
dplane_ctx_set_status(ctx, ZEBRA_DPLANE_REQUEST_SUCCESS);
dplane_provider_enqueue_out_ctx(prov, ctx);
}
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index dc679ed495..ab07ef8d21 100644
--- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c
@@ -3178,6 +3178,9 @@ netlink_put_route_update_msg(struct nl_batch *bth, struct zebra_dplane_ctx *ctx)
} else
return FRR_NETLINK_ERROR;
+ if (dplane_ctx_get_safi(ctx) == SAFI_MULTICAST)
+ return FRR_NETLINK_SUCCESS;
+
if (RSYSTEM_ROUTE(dplane_ctx_get_type(ctx)))
return FRR_NETLINK_SUCCESS;
diff --git a/zebra/rt_socket.c b/zebra/rt_socket.c
index 0bfcd518ca..4444eda94b 100644
--- a/zebra/rt_socket.c
+++ b/zebra/rt_socket.c
@@ -317,12 +317,12 @@ enum zebra_dplane_result kernel_route_update(struct zebra_dplane_ctx *ctx)
frr_with_privs(&zserv_privs) {
if (dplane_ctx_get_op(ctx) == DPLANE_OP_ROUTE_DELETE) {
- if (!RSYSTEM_ROUTE(type))
+ if (!RSYSTEM_ROUTE(type) && dplane_ctx_get_safi(ctx) != SAFI_MULTICAST)
kernel_rtm(RTM_DELETE, dplane_ctx_get_dest(ctx),
dplane_ctx_get_ng(ctx),
dplane_ctx_get_metric(ctx));
} else if (dplane_ctx_get_op(ctx) == DPLANE_OP_ROUTE_INSTALL) {
- if (!RSYSTEM_ROUTE(type))
+ if (!RSYSTEM_ROUTE(type) && dplane_ctx_get_safi(ctx) != SAFI_MULTICAST)
kernel_rtm(RTM_ADD, dplane_ctx_get_dest(ctx),
dplane_ctx_get_ng(ctx),
dplane_ctx_get_metric(ctx));
@@ -330,12 +330,12 @@ enum zebra_dplane_result kernel_route_update(struct zebra_dplane_ctx *ctx)
/* Must do delete and add separately -
* no update available
*/
- if (!RSYSTEM_ROUTE(old_type))
+ if (!RSYSTEM_ROUTE(old_type) && dplane_ctx_get_safi(ctx) != SAFI_MULTICAST)
kernel_rtm(RTM_DELETE, dplane_ctx_get_dest(ctx),
dplane_ctx_get_old_ng(ctx),
dplane_ctx_get_old_metric(ctx));
- if (!RSYSTEM_ROUTE(type))
+ if (!RSYSTEM_ROUTE(type) && dplane_ctx_get_safi(ctx) != SAFI_MULTICAST)
kernel_rtm(RTM_ADD, dplane_ctx_get_dest(ctx),
dplane_ctx_get_ng(ctx),
dplane_ctx_get_metric(ctx));
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index 8acb07374d..aea39b8ecf 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -637,19 +637,12 @@ int zebra_rib_labeled_unicast(struct route_entry *re)
void rib_install_kernel(struct route_node *rn, struct route_entry *re,
struct route_entry *old)
{
- struct nexthop *nexthop;
struct rib_table_info *info = srcdest_rnode_table_info(rn);
struct zebra_vrf *zvrf = zebra_vrf_lookup_by_id(re->vrf_id);
enum zebra_dplane_result ret;
rib_dest_t *dest = rib_dest_from_rnode(rn);
- if (info->safi != SAFI_UNICAST) {
- for (ALL_NEXTHOPS(re->nhe->nhg, nexthop))
- SET_FLAG(nexthop->flags, NEXTHOP_FLAG_FIB);
- return;
- }
-
/*
* Install the resolved nexthop object first.
*/
@@ -716,17 +709,8 @@ void rib_install_kernel(struct route_node *rn, struct route_entry *re,
/* Uninstall the route from kernel. */
void rib_uninstall_kernel(struct route_node *rn, struct route_entry *re)
{
- struct nexthop *nexthop;
- struct rib_table_info *info = srcdest_rnode_table_info(rn);
struct zebra_vrf *zvrf = zebra_vrf_lookup_by_id(re->vrf_id);
- if (info->safi != SAFI_UNICAST) {
- UNSET_FLAG(re->status, ROUTE_ENTRY_INSTALLED);
- for (ALL_NEXTHOPS(re->nhe->nhg, nexthop))
- UNSET_FLAG(nexthop->flags, NEXTHOP_FLAG_FIB);
- return;
- }
-
/*
* Make sure we update the FPM any time we send new information to
* the dataplane.