diff --git a/zebra/zebra_dplane.c b/zebra/zebra_dplane.c index 2346cb7f0d..e4002252d3 100644 --- a/zebra/zebra_dplane.c +++ b/zebra/zebra_dplane.c @@ -1589,8 +1589,8 @@ static int dplane_ctx_nexthop_init(struct zebra_dplane_ctx *ctx, /* If its a group, convert it to a grp array of ids */ if (!zebra_nhg_depends_is_empty(nhe) && !CHECK_FLAG(nhe->flags, NEXTHOP_GROUP_RECURSIVE)) - ctx->u.rinfo.nhe.nh_grp_count = - zebra_nhg_nhe2grp(ctx->u.rinfo.nhe.nh_grp, nhe); + ctx->u.rinfo.nhe.nh_grp_count = zebra_nhg_nhe2grp( + ctx->u.rinfo.nhe.nh_grp, nhe, MULTIPATH_NUM); zns = ((struct zebra_vrf *)vrf_info_lookup(nhe->vrf_id))->zns; diff --git a/zebra/zebra_nhg.c b/zebra/zebra_nhg.c index 24eae603f2..870f4afb27 100644 --- a/zebra/zebra_nhg.c +++ b/zebra/zebra_nhg.c @@ -1444,13 +1444,16 @@ done: } /* Convert a nhe into a group array */ -uint8_t zebra_nhg_nhe2grp(struct nh_grp *grp, struct nhg_hash_entry *nhe) +uint8_t zebra_nhg_nhe2grp(struct nh_grp *grp, struct nhg_hash_entry *nhe, + int max_num) { struct nhg_connected *rb_node_dep = NULL; struct nhg_hash_entry *depend = NULL; uint8_t i = 0; frr_each (nhg_connected_tree, &nhe->nhg_depends, rb_node_dep) { + bool duplicate = false; + depend = rb_node_dep->nhe; /* @@ -1467,11 +1470,24 @@ uint8_t zebra_nhg_nhe2grp(struct nh_grp *grp, struct nhg_hash_entry *nhe) } } - grp[i].id = depend->id; - /* We aren't using weights for anything right now */ - grp[i].weight = 0; - i++; + /* Check for duplicate IDs, kernel doesn't like that */ + for (int j = 0; j < i; j++) { + if (depend->id == grp[j].id) + duplicate = true; + } + + if (!duplicate) { + grp[i].id = depend->id; + /* We aren't using weights for anything right now */ + grp[i].weight = 0; + i++; + } + + if (i >= max_num) + goto done; } + +done: return i; } diff --git a/zebra/zebra_nhg.h b/zebra/zebra_nhg.h index 0be821267e..e06d415b28 100644 --- a/zebra/zebra_nhg.h +++ b/zebra/zebra_nhg.h @@ -236,8 +236,8 @@ extern int nexthop_active_update(struct route_node *rn, struct route_entry *re); extern int zebra_nhg_re_update_ref(struct route_entry *re, struct nhg_hash_entry *nhe); -extern uint8_t zebra_nhg_nhe2grp(struct nh_grp *grp, - struct nhg_hash_entry *nhe); +extern uint8_t zebra_nhg_nhe2grp(struct nh_grp *grp, struct nhg_hash_entry *nhe, + int size); void zebra_nhg_install_kernel(struct nhg_hash_entry *nhe); void zebra_nhg_uninstall_kernel(struct nhg_hash_entry *nhe);