]> git.puffer.fish Git - mirror/frr.git/commitdiff
isisd: fix isis_circuit_create()
authorDavid Lamparter <equinox@opensourcerouting.org>
Thu, 11 Aug 2016 14:59:08 +0000 (16:59 +0200)
committerDavid Lamparter <equinox@opensourcerouting.org>
Tue, 16 Aug 2016 14:05:42 +0000 (16:05 +0200)
Between the awkwardly managed CSM and the tacked-on IPv6 support, the
simplified logic to setup a circuit wasn't quite right.

Note that the API essentially allows creating a circuit without enabling
either IPv4 or IPv6.  This wasn't possible before and probably breaks
isisd in 'interesting' ways.  The CLI won't do this, so it's only an
issue when adding on other configuration mechanisms.

Reported-by: Martin Winter <mwinter@opensourcerouting.org>
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
isisd/isis_circuit.c
isisd/isis_vty.c

index d8ca694d59a21192a1793d41702aac30a7d935d5..b9ebf52505f5767ed9d0bb017bfabbab75645fff 100644 (file)
@@ -1226,8 +1226,10 @@ isis_interface_config_write (struct vty *vty)
 struct isis_circuit *
 isis_circuit_create (struct isis_area *area, struct interface *ifp)
 {
-  struct isis_circuit *circuit;
-  circuit = isis_csm_state_change (ISIS_ENABLE, NULL, area);
+  struct isis_circuit *circuit = circuit_scan_by_ifp (ifp);
+  if (circuit && circuit->area)
+    return NULL;
+  circuit = isis_csm_state_change (ISIS_ENABLE, circuit, area);
   assert (circuit->state == C_STATE_CONF || circuit->state == C_STATE_UP);
   isis_circuit_if_bind (circuit, ifp);
   return circuit;
index 3f218561cc46744640140ec148a289a13fbdaa36..3ce06b83dadb7bb46cdd2d8beb3a9bd00fdff197 100644 (file)
@@ -72,17 +72,13 @@ DEFUN (ip_router_isis,
 
   /* Prevent more than one area per circuit */
   circuit = circuit_scan_by_ifp (ifp);
-  if (circuit)
+  if (circuit && circuit->area)
     {
-      if (circuit->ip_router == 1)
+      if (strcmp (circuit->area->area_tag, area_tag))
         {
-          if (strcmp (circuit->area->area_tag, area_tag))
-            {
-              vty_out (vty, "ISIS circuit is already defined on %s%s",
-                       circuit->area->area_tag, VTY_NEWLINE);
-              return CMD_ERR_NOTHING_TODO;
-            }
-          return CMD_SUCCESS;
+          vty_out (vty, "ISIS circuit is already defined on %s%s",
+                   circuit->area->area_tag, VTY_NEWLINE);
+          return CMD_ERR_NOTHING_TODO;
         }
     }
 
@@ -90,7 +86,7 @@ DEFUN (ip_router_isis,
   if (!area)
     area = isis_area_create (area_tag);
 
-  if (!circuit)
+  if (!circuit || !circuit->area)
     circuit = isis_circuit_create (area, ifp);
 
   bool ip = circuit->ip_router, ipv6 = circuit->ipv6_router;