mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-06-05 21:45:02 +00:00
Merge pull request #17492 from donaldsharp/zebra_nh_label_crash
lib, zebra: Do not have duplicate memory type problems
This commit is contained in:
commit
c84fd512ca
@ -581,6 +581,32 @@ void nexthop_del_labels(struct nexthop *nexthop)
|
|||||||
nexthop->nh_label_type = ZEBRA_LSP_NONE;
|
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,
|
void nexthop_add_srv6_seg6local(struct nexthop *nexthop, uint32_t action,
|
||||||
const struct seg6local_context *ctx)
|
const struct seg6local_context *ctx)
|
||||||
{
|
{
|
||||||
|
@ -154,6 +154,8 @@ void nexthops_free(struct nexthop *nexthop);
|
|||||||
void nexthop_add_labels(struct nexthop *nexthop, enum lsp_types_t ltype,
|
void nexthop_add_labels(struct nexthop *nexthop, enum lsp_types_t ltype,
|
||||||
uint8_t num_labels, const mpls_label_t *labels);
|
uint8_t num_labels, const mpls_label_t *labels);
|
||||||
void nexthop_del_labels(struct nexthop *);
|
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,
|
void nexthop_add_srv6_seg6local(struct nexthop *nexthop, uint32_t action,
|
||||||
const struct seg6local_context *ctx);
|
const struct seg6local_context *ctx);
|
||||||
void nexthop_del_srv6_seg6local(struct nexthop *nexthop);
|
void nexthop_del_srv6_seg6local(struct nexthop *nexthop);
|
||||||
|
@ -37,7 +37,6 @@
|
|||||||
DEFINE_MTYPE_STATIC(ZEBRA, LSP, "MPLS LSP object");
|
DEFINE_MTYPE_STATIC(ZEBRA, LSP, "MPLS LSP object");
|
||||||
DEFINE_MTYPE_STATIC(ZEBRA, FEC, "MPLS FEC object");
|
DEFINE_MTYPE_STATIC(ZEBRA, FEC, "MPLS FEC object");
|
||||||
DEFINE_MTYPE_STATIC(ZEBRA, NHLFE, "MPLS nexthop object");
|
DEFINE_MTYPE_STATIC(ZEBRA, NHLFE, "MPLS nexthop object");
|
||||||
DEFINE_MTYPE_STATIC(ZEBRA, NH_LABEL, "Nexthop label");
|
|
||||||
|
|
||||||
bool mpls_enabled;
|
bool mpls_enabled;
|
||||||
bool mpls_pw_reach_strict; /* Strict reachability checking */
|
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,
|
static void nhlfe_out_label_update(struct zebra_nhlfe *nhlfe,
|
||||||
struct mpls_label_stack *nh_label)
|
struct mpls_label_stack *nh_label)
|
||||||
{
|
{
|
||||||
struct mpls_label_stack *nh_label_tmp;
|
nexthop_change_labels(nhlfe->nexthop, nh_label);
|
||||||
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];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mpls_lsp_uninstall_all(struct hash *lsp_table, struct zebra_lsp *lsp,
|
static int mpls_lsp_uninstall_all(struct hash *lsp_table, struct zebra_lsp *lsp,
|
||||||
|
Loading…
Reference in New Issue
Block a user