diff options
-rw-r--r-- | isisd/isis_circuit.c | 12 | ||||
-rw-r--r-- | isisd/isis_pdu.c | 14 |
2 files changed, 20 insertions, 6 deletions
diff --git a/isisd/isis_circuit.c b/isisd/isis_circuit.c index d1eaa8a17..9f597368d 100644 --- a/isisd/isis_circuit.c +++ b/isisd/isis_circuit.c @@ -122,13 +122,13 @@ isis_circuit_configure (struct isis_circuit *circuit, struct isis_area *area) circuit->area = area; /* - * The level for the circuit is same as for the area, unless configured - * otherwise. + * Whenever the is-type of an area is changed, the is-type of each circuit + * in that area is updated to a non-empty subset of the area is-type. + * Inversely, when configuring a new circuit, this property should be + * ensured as well. */ - if (area->is_type != IS_LEVEL_1_AND_2 && area->is_type != circuit->is_type) - zlog_warn ("circut %s is_type %d mismatch with area %s is_type %d", - circuit->interface->name, circuit->is_type, - circuit->area->area_tag, area->is_type); + if (area->is_type != IS_LEVEL_1_AND_2) + circuit->is_type = area->is_type; /* * Add the circuit into area diff --git a/isisd/isis_pdu.c b/isisd/isis_pdu.c index 3db57bca8..d9e98f268 100644 --- a/isisd/isis_pdu.c +++ b/isisd/isis_pdu.c @@ -2420,6 +2420,13 @@ send_lan_l1_hello (struct thread *thread) assert (circuit); circuit->u.bc.t_send_lan_hello[0] = NULL; + if (!(circuit->area->is_type & IS_LEVEL_1)) + { + zlog_warn ("ISIS-Hello (%s): Trying to send L1 IIH in L2-only area", + circuit->area->area_tag); + return 1; + } + if (circuit->u.bc.run_dr_elect[0]) retval = isis_dr_elect (circuit, 1); @@ -2443,6 +2450,13 @@ send_lan_l2_hello (struct thread *thread) assert (circuit); circuit->u.bc.t_send_lan_hello[1] = NULL; + if (!(circuit->area->is_type & IS_LEVEL_2)) + { + zlog_warn ("ISIS-Hello (%s): Trying to send L2 IIH in L1 area", + circuit->area->area_tag); + return 1; + } + if (circuit->u.bc.run_dr_elect[1]) retval = isis_dr_elect (circuit, 2); |