From: Igor Ryzhov Date: Thu, 8 Oct 2020 16:23:08 +0000 (+0300) Subject: isisd: fix incorrect vrf lookups X-Git-Tag: frr-7.5~10^2~6 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=e3229b19d076640aecf296bd9aba07a508f5b26e;p=matthieu%2Ffrr.git isisd: fix incorrect vrf lookups Lookup in C_STATE_NA must be made before the new circuit creation, or it will be leaked if the isis instance is not found. All other lookups are unnecessary - we just need to remember the previously used instance. Signed-off-by: Igor Ryzhov --- diff --git a/isisd/isis_circuit.h b/isisd/isis_circuit.h index da358f411b..008d7444ff 100644 --- a/isisd/isis_circuit.h +++ b/isisd/isis_circuit.h @@ -79,6 +79,7 @@ struct isis_circuit_arg { struct isis_circuit { int state; uint8_t circuit_id; /* l1/l2 bcast CircuitID */ + struct isis *isis; struct isis_area *area; /* back pointer to the area */ struct interface *interface; /* interface info from z */ int fd; /* IS-IS l1/2 socket */ diff --git a/isisd/isis_csm.c b/isisd/isis_csm.c index c848ed2638..f5ad0aff48 100644 --- a/isisd/isis_csm.c +++ b/isisd/isis_csm.c @@ -83,16 +83,17 @@ isis_csm_state_change(int event, struct isis_circuit *circuit, void *arg) circuit->state = C_STATE_CONF; break; case IF_UP_FROM_Z: - circuit = isis_circuit_new(); - isis_circuit_if_add(circuit, (struct interface *)arg); - isis = isis_lookup_by_vrfid(circuit->interface->vrf_id); + isis = isis_lookup_by_vrfid(((struct interface *)arg)->vrf_id); if (isis == NULL) { zlog_warn( " %s : ISIS routing instance not found", __func__); break; } + circuit = isis_circuit_new(); + isis_circuit_if_add(circuit, (struct interface *)arg); listnode_add(isis->init_circ_list, circuit); + circuit->isis = isis; circuit->state = C_STATE_INIT; break; case ISIS_DISABLE: @@ -117,7 +118,7 @@ isis_csm_state_change(int event, struct isis_circuit *circuit, void *arg) circuit->state = C_STATE_UP; isis_event_circuit_state_change(circuit, circuit->area, 1); - listnode_delete(circuit->area->isis->init_circ_list, + listnode_delete(circuit->isis->init_circ_list, circuit); break; case IF_UP_FROM_Z: @@ -129,15 +130,8 @@ isis_csm_state_change(int event, struct isis_circuit *circuit, void *arg) break; case IF_DOWN_FROM_Z: isis_circuit_if_del(circuit, (struct interface *)arg); - isis = isis_lookup_by_vrfid(circuit->interface->vrf_id); - if (isis == NULL) { - zlog_warn( - "%s : ISIS routing instance not found", - __func__); - break; - } - - listnode_delete(isis->init_circ_list, circuit); + listnode_delete(circuit->isis->init_circ_list, + circuit); isis_circuit_del(circuit); circuit = NULL; break; @@ -184,22 +178,15 @@ isis_csm_state_change(int event, struct isis_circuit *circuit, void *arg) zlog_warn("circuit already connected"); break; case ISIS_DISABLE: + isis = circuit->area->isis; isis_circuit_down(circuit); isis_circuit_deconfigure(circuit, (struct isis_area *)arg); circuit->state = C_STATE_INIT; isis_event_circuit_state_change( circuit, (struct isis_area *)arg, 0); - - isis = isis_lookup_by_vrfid(circuit->interface->vrf_id); - if (isis == NULL) { - zlog_warn( - "%s : ISIS routing instance not found", - __func__); - break; - } - listnode_add(isis->init_circ_list, circuit); + circuit->isis = isis; break; case IF_DOWN_FROM_Z: isis_circuit_down(circuit);