diff --git a/lib/nexthop.c b/lib/nexthop.c index 98b05295b996..332581fbd8f4 100644 --- a/lib/nexthop.c +++ b/lib/nexthop.c @@ -581,6 +581,32 @@ void nexthop_del_labels(struct nexthop *nexthop) nexthop->nh_label_type = ZEBRA_LSP_NONE; } +void nexthop_change_labels(struct nexthop *nexthop, struct mpls_label_stack *new_stack) +{ + struct mpls_label_stack *nh_label_tmp; + uint32_t i; + + /* Enforce limit on label stack size */ + if (new_stack->num_labels > MPLS_MAX_LABELS) + new_stack->num_labels = MPLS_MAX_LABELS; + + /* Resize the array to accommodate the new label stack */ + if (new_stack->num_labels > nexthop->nh_label->num_labels) { + nh_label_tmp = XREALLOC(MTYPE_NH_LABEL, nexthop->nh_label, + sizeof(struct mpls_label_stack) + + new_stack->num_labels * sizeof(mpls_label_t)); + if (nh_label_tmp) { + nexthop->nh_label = nh_label_tmp; + nexthop->nh_label->num_labels = new_stack->num_labels; + } else + new_stack->num_labels = nexthop->nh_label->num_labels; + } + + /* Copy the label stack into the array */ + for (i = 0; i < new_stack->num_labels; i++) + nexthop->nh_label->label[i] = new_stack->label[i]; +} + void nexthop_add_srv6_seg6local(struct nexthop *nexthop, uint32_t action, const struct seg6local_context *ctx) { diff --git a/lib/nexthop.h b/lib/nexthop.h index 02ea4d96f2df..5dfb58d84661 100644 --- a/lib/nexthop.h +++ b/lib/nexthop.h @@ -154,6 +154,8 @@ void nexthops_free(struct nexthop *nexthop); void nexthop_add_labels(struct nexthop *nexthop, enum lsp_types_t ltype, uint8_t num_labels, const mpls_label_t *labels); void nexthop_del_labels(struct nexthop *); +void nexthop_change_labels(struct nexthop *nexthop, struct mpls_label_stack *new_stack); + void nexthop_add_srv6_seg6local(struct nexthop *nexthop, uint32_t action, const struct seg6local_context *ctx); void nexthop_del_srv6_seg6local(struct nexthop *nexthop); diff --git a/zebra/zebra_mpls.c b/zebra/zebra_mpls.c index 9549af5f14bc..0d3fd2a7268f 100644 --- a/zebra/zebra_mpls.c +++ b/zebra/zebra_mpls.c @@ -37,7 +37,6 @@ DEFINE_MTYPE_STATIC(ZEBRA, LSP, "MPLS LSP object"); DEFINE_MTYPE_STATIC(ZEBRA, FEC, "MPLS FEC object"); DEFINE_MTYPE_STATIC(ZEBRA, NHLFE, "MPLS nexthop object"); -DEFINE_MTYPE_STATIC(ZEBRA, NH_LABEL, "Nexthop label"); bool mpls_enabled; bool mpls_pw_reach_strict; /* Strict reachability checking */ @@ -1453,31 +1452,7 @@ static int nhlfe_del(struct zebra_nhlfe *nhlfe) static void nhlfe_out_label_update(struct zebra_nhlfe *nhlfe, struct mpls_label_stack *nh_label) { - struct mpls_label_stack *nh_label_tmp; - int i; - - /* Enforce limit on label stack size */ - if (nh_label->num_labels > MPLS_MAX_LABELS) - nh_label->num_labels = MPLS_MAX_LABELS; - - /* Resize the array to accommodate the new label stack */ - if (nh_label->num_labels > nhlfe->nexthop->nh_label->num_labels) { - nh_label_tmp = XREALLOC(MTYPE_NH_LABEL, nhlfe->nexthop->nh_label, - sizeof(struct mpls_label_stack) + - nh_label->num_labels * - sizeof(mpls_label_t)); - if (nh_label_tmp) { - nhlfe->nexthop->nh_label = nh_label_tmp; - nhlfe->nexthop->nh_label->num_labels = - nh_label->num_labels; - } else - nh_label->num_labels = - nhlfe->nexthop->nh_label->num_labels; - } - - /* Copy the label stack into the array */ - for (i = 0; i < nh_label->num_labels; i++) - nhlfe->nexthop->nh_label->label[i] = nh_label->label[i]; + nexthop_change_labels(nhlfe->nexthop, nh_label); } static int mpls_lsp_uninstall_all(struct hash *lsp_table, struct zebra_lsp *lsp,