isisd: fix isis_circuit_create()

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>
This commit is contained in:
David Lamparter 2016-08-11 16:59:08 +02:00
parent d8efb772eb
commit 9af6011992
2 changed files with 10 additions and 12 deletions

View 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;

View 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;