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 <iryzhov@nfware.com>
This commit is contained in:
Igor Ryzhov 2020-10-08 19:23:08 +03:00
parent 733c4db587
commit 0bcdb96bb1
2 changed files with 10 additions and 22 deletions

View File

@ -79,6 +79,7 @@ struct isis_circuit_arg {
struct isis_circuit { struct isis_circuit {
int state; int state;
uint8_t circuit_id; /* l1/l2 bcast CircuitID */ uint8_t circuit_id; /* l1/l2 bcast CircuitID */
struct isis *isis;
struct isis_area *area; /* back pointer to the area */ struct isis_area *area; /* back pointer to the area */
struct interface *interface; /* interface info from z */ struct interface *interface; /* interface info from z */
int fd; /* IS-IS l1/2 socket */ int fd; /* IS-IS l1/2 socket */

View File

@ -83,16 +83,17 @@ isis_csm_state_change(int event, struct isis_circuit *circuit, void *arg)
circuit->state = C_STATE_CONF; circuit->state = C_STATE_CONF;
break; break;
case IF_UP_FROM_Z: case IF_UP_FROM_Z:
circuit = isis_circuit_new(); isis = isis_lookup_by_vrfid(((struct interface *)arg)->vrf_id);
isis_circuit_if_add(circuit, (struct interface *)arg);
isis = isis_lookup_by_vrfid(circuit->interface->vrf_id);
if (isis == NULL) { if (isis == NULL) {
zlog_warn( zlog_warn(
" %s : ISIS routing instance not found", " %s : ISIS routing instance not found",
__func__); __func__);
break; break;
} }
circuit = isis_circuit_new();
isis_circuit_if_add(circuit, (struct interface *)arg);
listnode_add(isis->init_circ_list, circuit); listnode_add(isis->init_circ_list, circuit);
circuit->isis = isis;
circuit->state = C_STATE_INIT; circuit->state = C_STATE_INIT;
break; break;
case ISIS_DISABLE: case ISIS_DISABLE:
@ -117,7 +118,7 @@ isis_csm_state_change(int event, struct isis_circuit *circuit, void *arg)
circuit->state = C_STATE_UP; circuit->state = C_STATE_UP;
isis_event_circuit_state_change(circuit, circuit->area, isis_event_circuit_state_change(circuit, circuit->area,
1); 1);
listnode_delete(circuit->area->isis->init_circ_list, listnode_delete(circuit->isis->init_circ_list,
circuit); circuit);
break; break;
case IF_UP_FROM_Z: case IF_UP_FROM_Z:
@ -129,15 +130,8 @@ isis_csm_state_change(int event, struct isis_circuit *circuit, void *arg)
break; break;
case IF_DOWN_FROM_Z: case IF_DOWN_FROM_Z:
isis_circuit_if_del(circuit, (struct interface *)arg); isis_circuit_if_del(circuit, (struct interface *)arg);
isis = isis_lookup_by_vrfid(circuit->interface->vrf_id); listnode_delete(circuit->isis->init_circ_list,
if (isis == NULL) { circuit);
zlog_warn(
"%s : ISIS routing instance not found",
__func__);
break;
}
listnode_delete(isis->init_circ_list, circuit);
isis_circuit_del(circuit); isis_circuit_del(circuit);
circuit = NULL; circuit = NULL;
break; break;
@ -184,22 +178,15 @@ isis_csm_state_change(int event, struct isis_circuit *circuit, void *arg)
zlog_warn("circuit already connected"); zlog_warn("circuit already connected");
break; break;
case ISIS_DISABLE: case ISIS_DISABLE:
isis = circuit->area->isis;
isis_circuit_down(circuit); isis_circuit_down(circuit);
isis_circuit_deconfigure(circuit, isis_circuit_deconfigure(circuit,
(struct isis_area *)arg); (struct isis_area *)arg);
circuit->state = C_STATE_INIT; circuit->state = C_STATE_INIT;
isis_event_circuit_state_change( isis_event_circuit_state_change(
circuit, (struct isis_area *)arg, 0); 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); listnode_add(isis->init_circ_list, circuit);
circuit->isis = isis;
break; break;
case IF_DOWN_FROM_Z: case IF_DOWN_FROM_Z:
isis_circuit_down(circuit); isis_circuit_down(circuit);