Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mrib nht wonky #17254

Merged
merged 3 commits into from
Oct 28, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
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>
  • Loading branch information
donaldsharp committed Oct 28, 2024
commit 3bff65abc75e952a15b98666e7271189ac28a2bc
12 changes: 11 additions & 1 deletion zebra/dplane_fpm_nl.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 =
Expand All @@ -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);
}
Expand Down
3 changes: 3 additions & 0 deletions zebra/rt_netlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
8 changes: 4 additions & 4 deletions zebra/rt_socket.c
Original file line number Diff line number Diff line change
Expand Up @@ -317,25 +317,25 @@ 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));
} else if (dplane_ctx_get_op(ctx) == DPLANE_OP_ROUTE_UPDATE) {
/* 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));
Expand Down
16 changes: 0 additions & 16 deletions zebra/zebra_rib.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*/
Expand Down Expand Up @@ -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.
Expand Down
Loading