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

isisd: fix crash at flex-algo affinity setting #16772

Merged
merged 4 commits into from
Sep 10, 2024
Merged
Changes from all commits
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
168 changes: 70 additions & 98 deletions isisd/isis_nb_config.c
Original file line number Diff line number Diff line change
Expand Up @@ -2890,29 +2890,22 @@ int isis_instance_flex_algo_destroy(struct nb_cb_destroy_args *args)
struct isis_area *area;
uint32_t algorithm;

if (args->event != NB_EV_APPLY)
return NB_OK;

algorithm = yang_dnode_get_uint32(args->dnode, "flex-algo");
area = nb_running_get_entry(args->dnode, NULL, true);

switch (args->event) {
case NB_EV_APPLY:
for (ALL_LIST_ELEMENTS(area->flex_algos->flex_algos, node,
nnode, fa)) {
if (fa->algorithm == algorithm)
flex_algo_free(area->flex_algos, fa);
}
if (list_isempty(area->flex_algos->flex_algos)) {
for (ALL_LIST_ELEMENTS_RO(area->circuit_list, node,
circuit))
isis_link_params_update_asla(circuit,
circuit->interface);
}
lsp_regenerate_schedule(area, area->is_type, 0);
break;
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
break;
for (ALL_LIST_ELEMENTS(area->flex_algos->flex_algos, node, nnode, fa)) {
if (fa->algorithm == algorithm)
flex_algo_free(area->flex_algos, fa);
}
if (list_isempty(area->flex_algos->flex_algos)) {
for (ALL_LIST_ELEMENTS_RO(area->circuit_list, node, circuit))
isis_link_params_update_asla(circuit,
circuit->interface);
}
lsp_regenerate_schedule(area, area->is_type, 0);

return NB_OK;
}
Expand Down Expand Up @@ -2960,54 +2953,46 @@ int isis_instance_flex_algo_advertise_definition_destroy(
struct flex_algo *fa;
uint32_t algorithm;


if (args->event != NB_EV_APPLY)
return NB_OK;

area = nb_running_get_entry(args->dnode, NULL, true);

algorithm = yang_dnode_get_uint32(args->dnode, "../flex-algo");

switch (args->event) {
case NB_EV_APPLY:
fa = flex_algo_lookup(area->flex_algos, algorithm);
if (!fa) {
snprintf(args->errmsg, args->errmsg_len,
"flex-algo object not found");
return NB_ERR_RESOURCE;
}
fa->advertise_definition = false;
lsp_regenerate_schedule(area, area->is_type, 0);
break;
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
break;
fa = flex_algo_lookup(area->flex_algos, algorithm);
if (!fa) {
snprintf(args->errmsg, args->errmsg_len,
"flex-algo object not found");
return NB_ERR_RESOURCE;
}
fa->advertise_definition = false;
lsp_regenerate_schedule(area, area->is_type, 0);

return NB_OK;
}

static int isis_instance_flex_algo_affinity_set(struct nb_cb_create_args *args,
int type)
{
struct affinity_map *map;
char xpathr[XPATH_MAXLEN];
struct lyd_node *dnode;
struct isis_area *area;
struct admin_group *ag;
uint16_t bit_position;
struct flex_algo *fa;
uint32_t algorithm;
const char *val;

algorithm = yang_dnode_get_uint32(args->dnode, "../../flex-algo");
area = nb_running_get_entry(args->dnode, NULL, true);
val = yang_dnode_get_string(args->dnode, ".");

switch (args->event) {
case NB_EV_VALIDATE:
fa = flex_algo_lookup(area->flex_algos, algorithm);
if (!fa) {
snprintf(args->errmsg, args->errmsg_len,
"flex-algo object not found");
return NB_ERR_RESOURCE;
}
map = affinity_map_get(val);
if (!map) {
snprintf(xpathr, sizeof(xpathr),
"/frr-affinity-map:lib/affinity-maps/affinity-map[name='%s']/value",
val);
if (!yang_dnode_get(args->dnode, xpathr)) {
snprintf(args->errmsg, args->errmsg_len,
"affinity map %s isn't found", val);
return NB_ERR_VALIDATION;
Expand All @@ -3017,14 +3002,20 @@ static int isis_instance_flex_algo_affinity_set(struct nb_cb_create_args *args,
case NB_EV_ABORT:
break;
case NB_EV_APPLY:
algorithm = yang_dnode_get_uint32(args->dnode,
"../../flex-algo");
area = nb_running_get_entry(args->dnode, NULL, true);
fa = flex_algo_lookup(area->flex_algos, algorithm);
if (!fa) {
snprintf(args->errmsg, args->errmsg_len,
"flex-algo object not found");
return NB_ERR_RESOURCE;
}
map = affinity_map_get(val);
if (!map) {
snprintf(xpathr, sizeof(xpathr),
"/frr-affinity-map:lib/affinity-maps/affinity-map[name='%s']/value",
val);
dnode = yang_dnode_get(args->dnode, xpathr);
if (!dnode) {
snprintf(args->errmsg, args->errmsg_len,
"affinity map %s isn't found", val);
return NB_ERR_RESOURCE;
Expand All @@ -3038,7 +3029,8 @@ static int isis_instance_flex_algo_affinity_set(struct nb_cb_create_args *args,
else
break;

admin_group_set(ag, map->bit_position);
bit_position = yang_dnode_get_uint16(dnode, NULL);
admin_group_set(ag, bit_position);
lsp_regenerate_schedule(area, area->is_type, 0);
break;
}
Expand All @@ -3057,18 +3049,10 @@ isis_instance_flex_algo_affinity_unset(struct nb_cb_destroy_args *args,
uint32_t algorithm;
const char *val;

algorithm = yang_dnode_get_uint32(args->dnode, "../../flex-algo");
area = nb_running_get_entry(args->dnode, NULL, true);
val = yang_dnode_get_string(args->dnode, ".");

switch (args->event) {
case NB_EV_VALIDATE:
fa = flex_algo_lookup(area->flex_algos, algorithm);
if (!fa) {
snprintf(args->errmsg, args->errmsg_len,
"flex-algo object not found");
return NB_ERR_RESOURCE;
}
map = affinity_map_get(val);
if (!map) {
snprintf(args->errmsg, args->errmsg_len,
Expand All @@ -3080,6 +3064,9 @@ isis_instance_flex_algo_affinity_unset(struct nb_cb_destroy_args *args,
case NB_EV_ABORT:
break;
case NB_EV_APPLY:
algorithm = yang_dnode_get_uint32(args->dnode,
"../../flex-algo");
area = nb_running_get_entry(args->dnode, NULL, true);
fa = flex_algo_lookup(area->flex_algos, algorithm);
if (!fa) {
snprintf(args->errmsg, args->errmsg_len,
Expand Down Expand Up @@ -3169,19 +3156,16 @@ int isis_instance_flex_algo_affinity_exclude_any_destroy(
int isis_instance_flex_algo_prefix_metric_create(struct nb_cb_create_args *args)
{
struct isis_area *area;
const char *area_tag;
struct flex_algo *fa;
uint32_t algorithm;

area_tag = yang_dnode_get_string(args->dnode, "../../../area-tag");
area = isis_area_lookup(area_tag, VRF_DEFAULT);
if (!area)
return NB_ERR_RESOURCE;

algorithm = yang_dnode_get_uint32(args->dnode, "../flex-algo");

switch (args->event) {
case NB_EV_APPLY:
area = nb_running_get_entry(args->dnode, NULL, true);
if (!area)
return NB_ERR_RESOURCE;
fa = flex_algo_lookup(area->flex_algos, algorithm);
if (!fa) {
snprintf(args->errmsg, args->errmsg_len,
Expand All @@ -3204,19 +3188,17 @@ int isis_instance_flex_algo_prefix_metric_destroy(
struct nb_cb_destroy_args *args)
{
struct isis_area *area;
const char *area_tag;
struct flex_algo *fa;
uint32_t algorithm;

area_tag = yang_dnode_get_string(args->dnode, "../../../area-tag");
area = isis_area_lookup(area_tag, VRF_DEFAULT);
if (!area)
return NB_ERR_RESOURCE;

algorithm = yang_dnode_get_uint32(args->dnode, "../flex-algo");

switch (args->event) {
case NB_EV_APPLY:
area = nb_running_get_entry(args->dnode, NULL, true);
if (!area)
return NB_ERR_RESOURCE;

fa = flex_algo_lookup(area->flex_algos, algorithm);
if (!fa) {
snprintf(args->errmsg, args->errmsg_len,
Expand All @@ -3239,19 +3221,17 @@ static int isis_instance_flex_algo_dplane_set(struct nb_cb_create_args *args,
int type)
{
struct isis_area *area;
const char *area_tag;
struct flex_algo *fa;
uint32_t algorithm;

area_tag = yang_dnode_get_string(args->dnode, "../../../area-tag");
area = isis_area_lookup(area_tag, VRF_DEFAULT);
if (!area)
return NB_ERR_RESOURCE;

algorithm = yang_dnode_get_uint32(args->dnode, "../flex-algo");

switch (args->event) {
case NB_EV_APPLY:
area = nb_running_get_entry(args->dnode, NULL, true);
if (!area)
return NB_ERR_RESOURCE;

fa = flex_algo_lookup(area->flex_algos, algorithm);
if (!fa) {
snprintf(args->errmsg, args->errmsg_len,
Expand Down Expand Up @@ -3281,19 +3261,17 @@ static int isis_instance_flex_algo_dplane_unset(struct nb_cb_destroy_args *args,
int type)
{
struct isis_area *area;
const char *area_tag;
struct flex_algo *fa;
uint32_t algorithm;

area_tag = yang_dnode_get_string(args->dnode, "../../../area-tag");
area = isis_area_lookup(area_tag, VRF_DEFAULT);
if (!area)
return NB_ERR_RESOURCE;

algorithm = yang_dnode_get_uint32(args->dnode, "../flex-algo");

switch (args->event) {
case NB_EV_APPLY:
area = nb_running_get_entry(args->dnode, NULL, true);
if (!area)
return NB_ERR_RESOURCE;

fa = flex_algo_lookup(area->flex_algos, algorithm);
if (!fa) {
snprintf(args->errmsg, args->errmsg_len,
Expand Down Expand Up @@ -3363,21 +3341,19 @@ int isis_instance_flex_algo_dplane_ip_destroy(struct nb_cb_destroy_args *args)
int isis_instance_flex_algo_metric_type_modify(struct nb_cb_modify_args *args)
{
struct isis_area *area;
const char *area_tag;
struct flex_algo *fa;
uint32_t algorithm;
enum flex_algo_metric_type metric_type;

area_tag = yang_dnode_get_string(args->dnode, "../../../area-tag");
area = isis_area_lookup(area_tag, VRF_DEFAULT);
if (!area)
return NB_ERR_RESOURCE;

algorithm = yang_dnode_get_uint32(args->dnode, "../flex-algo");
metric_type = yang_dnode_get_enum(args->dnode, NULL);

switch (args->event) {
case NB_EV_APPLY:
area = nb_running_get_entry(args->dnode, NULL, true);
if (!area)
return NB_ERR_RESOURCE;

fa = flex_algo_lookup(area->flex_algos, algorithm);
if (!fa) {
snprintf(args->errmsg, args->errmsg_len,
Expand All @@ -3403,21 +3379,19 @@ int isis_instance_flex_algo_metric_type_modify(struct nb_cb_modify_args *args)
int isis_instance_flex_algo_priority_modify(struct nb_cb_modify_args *args)
{
struct isis_area *area;
const char *area_tag;
struct flex_algo *fa;
uint32_t algorithm;
uint32_t priority;

area_tag = yang_dnode_get_string(args->dnode, "../../../area-tag");
area = isis_area_lookup(area_tag, VRF_DEFAULT);
if (!area)
return NB_ERR_RESOURCE;

algorithm = yang_dnode_get_uint32(args->dnode, "../flex-algo");
priority = yang_dnode_get_uint32(args->dnode, NULL);

switch (args->event) {
case NB_EV_APPLY:
area = nb_running_get_entry(args->dnode, NULL, true);
if (!area)
return NB_ERR_RESOURCE;

fa = flex_algo_lookup(area->flex_algos, algorithm);
if (!fa) {
snprintf(args->errmsg, args->errmsg_len,
Expand All @@ -3439,21 +3413,19 @@ int isis_instance_flex_algo_priority_modify(struct nb_cb_modify_args *args)
int isis_instance_flex_algo_priority_destroy(struct nb_cb_destroy_args *args)
{
struct isis_area *area;
const char *area_tag;
struct flex_algo *fa;
uint32_t algorithm;
uint32_t priority = FLEX_ALGO_PRIO_DEFAULT;

area_tag = yang_dnode_get_string(args->dnode, "../../../area-tag");
area = isis_area_lookup(area_tag, VRF_DEFAULT);
if (!area)
return NB_ERR_RESOURCE;

algorithm = yang_dnode_get_uint32(args->dnode, "../flex-algo");
priority = yang_dnode_get_uint32(args->dnode, NULL);

switch (args->event) {
case NB_EV_APPLY:
area = nb_running_get_entry(args->dnode, NULL, true);
if (!area)
return NB_ERR_RESOURCE;

fa = flex_algo_lookup(area->flex_algos, algorithm);
if (!fa) {
snprintf(args->errmsg, args->errmsg_len,
Expand Down
Loading