mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-07 03:53:38 +00:00
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:
parent
733c4db587
commit
0bcdb96bb1
@ -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 */
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user