summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--isisd/isis_circuit.c12
-rw-r--r--isisd/isis_pdu.c14
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);