mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-13 12:37:10 +00:00
isisd: API: basic circuit config
Create isis_vty.c and start moving off CLI functions into that. These then call newly-added "nice" API wrappers. Patch contains significant work authored by Christian Franke. [v2: removed stuff that crept in from the next patch] Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
This commit is contained in:
parent
c66f9c6186
commit
65f9a9a8f5
@ -16,7 +16,8 @@ libisis_a_SOURCES = \
|
||||
isis_adjacency.c isis_lsp.c dict.c isis_circuit.c isis_pdu.c \
|
||||
isis_tlv.c isisd.c isis_misc.c isis_zebra.c isis_dr.c \
|
||||
isis_flags.c isis_dynhn.c iso_checksum.c isis_csm.c isis_events.c \
|
||||
isis_spf.c isis_redist.c isis_route.c isis_routemap.c
|
||||
isis_spf.c isis_redist.c isis_route.c isis_routemap.c \
|
||||
isis_vty.c
|
||||
|
||||
|
||||
noinst_HEADERS = \
|
||||
|
@ -1250,364 +1250,88 @@ isis_interface_config_write (struct vty *vty)
|
||||
return write;
|
||||
}
|
||||
|
||||
DEFUN (ip_router_isis,
|
||||
ip_router_isis_cmd,
|
||||
"ip router isis WORD",
|
||||
"Interface Internet Protocol config commands\n"
|
||||
"IP router interface commands\n"
|
||||
"IS-IS Routing for IP\n"
|
||||
"Routing process tag\n")
|
||||
struct isis_circuit *
|
||||
isis_circuit_create (struct isis_area *area, struct interface *ifp)
|
||||
{
|
||||
struct isis_circuit *circuit;
|
||||
struct interface *ifp;
|
||||
struct isis_area *area;
|
||||
int rv;
|
||||
|
||||
ifp = (struct interface *) vty->index;
|
||||
assert (ifp);
|
||||
|
||||
/* Prevent more than one area per circuit */
|
||||
circuit = circuit_scan_by_ifp (ifp);
|
||||
if (circuit)
|
||||
{
|
||||
if (circuit->ip_router == 1)
|
||||
{
|
||||
if (strcmp (circuit->area->area_tag, argv[0]))
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
if (isis_area_get (vty, argv[0]) != CMD_SUCCESS)
|
||||
{
|
||||
vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE);
|
||||
return CMD_ERR_NO_MATCH;
|
||||
}
|
||||
area = vty->index;
|
||||
|
||||
circuit = isis_csm_state_change (ISIS_ENABLE, circuit, area);
|
||||
if (circuit->state != C_STATE_CONF && circuit->state != C_STATE_UP)
|
||||
{
|
||||
vty_out(vty, "Couldn't bring up interface, please check log.%s", VTY_NEWLINE);
|
||||
rv = CMD_WARNING;
|
||||
}
|
||||
else
|
||||
{
|
||||
isis_circuit_if_bind (circuit, ifp);
|
||||
|
||||
circuit->ip_router = 1;
|
||||
area->ip_circuits++;
|
||||
circuit_update_nlpids (circuit);
|
||||
rv = CMD_SUCCESS;
|
||||
}
|
||||
|
||||
vty->node = INTERFACE_NODE;
|
||||
vty->index = ifp;
|
||||
|
||||
if (circuit->ipv6_router)
|
||||
lsp_regenerate_schedule(circuit->area, circuit->is_type, 0);
|
||||
return rv;
|
||||
circuit = isis_csm_state_change (ISIS_ENABLE, NULL, area);
|
||||
assert (circuit->state == C_STATE_CONF || circuit->state == C_STATE_UP);
|
||||
isis_circuit_if_bind (circuit, ifp);
|
||||
return circuit;
|
||||
}
|
||||
|
||||
DEFUN (no_ip_router_isis,
|
||||
no_ip_router_isis_cmd,
|
||||
"no ip router isis WORD",
|
||||
NO_STR
|
||||
"Interface Internet Protocol config commands\n"
|
||||
"IP router interface commands\n"
|
||||
"IS-IS Routing for IP\n"
|
||||
"Routing process tag\n")
|
||||
void
|
||||
isis_circuit_af_set (struct isis_circuit *circuit, bool ip_router, bool ipv6_router)
|
||||
{
|
||||
struct interface *ifp;
|
||||
struct isis_area *area;
|
||||
struct isis_circuit *circuit;
|
||||
struct isis_area *area = circuit->area;
|
||||
bool change = circuit->ip_router != ip_router || circuit->ipv6_router != ipv6_router;
|
||||
bool was_enabled = circuit->ip_router || circuit->ipv6_router;
|
||||
|
||||
ifp = (struct interface *) vty->index;
|
||||
if (!ifp)
|
||||
{
|
||||
vty_out (vty, "Invalid interface %s", VTY_NEWLINE);
|
||||
return CMD_ERR_NO_MATCH;
|
||||
}
|
||||
area->ip_circuits += ip_router - circuit->ip_router;
|
||||
area->ipv6_circuits += ipv6_router - circuit->ipv6_router;
|
||||
circuit->ip_router = ip_router;
|
||||
circuit->ipv6_router = ipv6_router;
|
||||
|
||||
area = isis_area_lookup (argv[0]);
|
||||
if (!area)
|
||||
{
|
||||
vty_out (vty, "Can't find ISIS instance %s%s",
|
||||
argv[0], VTY_NEWLINE);
|
||||
return CMD_ERR_NO_MATCH;
|
||||
}
|
||||
if (!change)
|
||||
return;
|
||||
|
||||
circuit = circuit_lookup_by_ifp (ifp, area->circuit_list);
|
||||
if (!circuit)
|
||||
{
|
||||
vty_out (vty, "ISIS is not enabled on circuit %s%s",
|
||||
ifp->name, VTY_NEWLINE);
|
||||
return CMD_ERR_NO_MATCH;
|
||||
}
|
||||
circuit_update_nlpids (circuit);
|
||||
|
||||
circuit->ip_router = 0;
|
||||
area->ip_circuits--;
|
||||
if (circuit->ipv6_router == 0)
|
||||
if (!ip_router && !ipv6_router)
|
||||
isis_csm_state_change (ISIS_DISABLE, circuit, area);
|
||||
else if (!was_enabled)
|
||||
isis_csm_state_change (ISIS_ENABLE, circuit, area);
|
||||
else
|
||||
lsp_regenerate_schedule(area, circuit->is_type, 0);
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
#ifdef HAVE_IPV6
|
||||
DEFUN (ipv6_router_isis,
|
||||
ipv6_router_isis_cmd,
|
||||
"ipv6 router isis WORD",
|
||||
"IPv6 interface subcommands\n"
|
||||
"IPv6 Router interface commands\n"
|
||||
"IS-IS Routing for IPv6\n"
|
||||
"Routing process tag\n")
|
||||
{
|
||||
struct isis_circuit *circuit;
|
||||
struct interface *ifp;
|
||||
struct isis_area *area;
|
||||
int rv;
|
||||
|
||||
ifp = (struct interface *) vty->index;
|
||||
assert (ifp);
|
||||
|
||||
/* Prevent more than one area per circuit */
|
||||
circuit = circuit_scan_by_ifp (ifp);
|
||||
if (circuit)
|
||||
{
|
||||
if (circuit->ipv6_router == 1)
|
||||
{
|
||||
if (strcmp (circuit->area->area_tag, argv[0]))
|
||||
{
|
||||
vty_out (vty, "ISIS circuit is already defined for IPv6 on %s%s",
|
||||
circuit->area->area_tag, VTY_NEWLINE);
|
||||
return CMD_ERR_NOTHING_TODO;
|
||||
}
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
if (isis_area_get (vty, argv[0]) != CMD_SUCCESS)
|
||||
{
|
||||
vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE);
|
||||
return CMD_ERR_NO_MATCH;
|
||||
}
|
||||
area = vty->index;
|
||||
|
||||
circuit = isis_csm_state_change (ISIS_ENABLE, circuit, area);
|
||||
if (circuit->state != C_STATE_CONF && circuit->state != C_STATE_UP)
|
||||
{
|
||||
vty_out(vty, "Couldn't bring up interface, please check log.%s", VTY_NEWLINE);
|
||||
rv = CMD_WARNING;
|
||||
}
|
||||
else
|
||||
{
|
||||
isis_circuit_if_bind (circuit, ifp);
|
||||
|
||||
circuit->ipv6_router = 1;
|
||||
area->ipv6_circuits++;
|
||||
circuit_update_nlpids (circuit);
|
||||
rv = CMD_SUCCESS;
|
||||
}
|
||||
|
||||
vty->node = INTERFACE_NODE;
|
||||
vty->index = ifp;
|
||||
|
||||
if (circuit->ip_router)
|
||||
lsp_regenerate_schedule(circuit->area, circuit->is_type, 0);
|
||||
return rv;
|
||||
}
|
||||
|
||||
DEFUN (no_ipv6_router_isis,
|
||||
no_ipv6_router_isis_cmd,
|
||||
"no ipv6 router isis WORD",
|
||||
NO_STR
|
||||
"IPv6 interface subcommands\n"
|
||||
"IPv6 Router interface commands\n"
|
||||
"IS-IS Routing for IPv6\n"
|
||||
"Routing process tag\n")
|
||||
int
|
||||
isis_circuit_passive_set (struct isis_circuit *circuit, bool passive)
|
||||
{
|
||||
struct interface *ifp;
|
||||
struct isis_area *area;
|
||||
struct isis_circuit *circuit;
|
||||
if (circuit->is_passive == passive)
|
||||
return 0;
|
||||
|
||||
ifp = (struct interface *) vty->index;
|
||||
if (!ifp)
|
||||
{
|
||||
vty_out (vty, "Invalid interface %s", VTY_NEWLINE);
|
||||
return CMD_ERR_NO_MATCH;
|
||||
}
|
||||
|
||||
area = isis_area_lookup (argv[0]);
|
||||
if (!area)
|
||||
{
|
||||
vty_out (vty, "Can't find ISIS instance %s%s",
|
||||
argv[0], VTY_NEWLINE);
|
||||
return CMD_ERR_NO_MATCH;
|
||||
}
|
||||
|
||||
circuit = circuit_lookup_by_ifp (ifp, area->circuit_list);
|
||||
if (!circuit)
|
||||
{
|
||||
vty_out (vty, "ISIS is not enabled on circuit %s%s",
|
||||
ifp->name, VTY_NEWLINE);
|
||||
return CMD_ERR_NO_MATCH;
|
||||
}
|
||||
|
||||
circuit->ipv6_router = 0;
|
||||
area->ipv6_circuits--;
|
||||
if (circuit->ip_router == 0)
|
||||
isis_csm_state_change (ISIS_DISABLE, circuit, area);
|
||||
else
|
||||
lsp_regenerate_schedule(area, circuit->is_type, 0);
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
#endif /* HAVE_IPV6 */
|
||||
|
||||
DEFUN (isis_passive,
|
||||
isis_passive_cmd,
|
||||
"isis passive",
|
||||
"IS-IS commands\n"
|
||||
"Configure the passive mode for interface\n")
|
||||
{
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
if (circuit->is_passive == 1)
|
||||
return CMD_SUCCESS;
|
||||
if (if_is_loopback (circuit->interface) && !passive)
|
||||
return -1;
|
||||
|
||||
if (circuit->state != C_STATE_UP)
|
||||
{
|
||||
circuit->is_passive = 1;
|
||||
circuit->is_passive = passive;
|
||||
}
|
||||
else
|
||||
{
|
||||
struct isis_area *area = circuit->area;
|
||||
isis_csm_state_change (ISIS_DISABLE, circuit, area);
|
||||
circuit->is_passive = 1;
|
||||
circuit->is_passive = passive;
|
||||
isis_csm_state_change (ISIS_ENABLE, circuit, area);
|
||||
}
|
||||
|
||||
return CMD_SUCCESS;
|
||||
return 0;
|
||||
}
|
||||
|
||||
DEFUN (no_isis_passive,
|
||||
no_isis_passive_cmd,
|
||||
"no isis passive",
|
||||
NO_STR
|
||||
"IS-IS commands\n"
|
||||
"Configure the passive mode for interface\n")
|
||||
void
|
||||
isis_circuit_is_type_set (struct isis_circuit *circuit, int circ_type)
|
||||
{
|
||||
struct interface *ifp;
|
||||
struct isis_circuit *circuit;
|
||||
|
||||
ifp = (struct interface *) vty->index;
|
||||
if (!ifp)
|
||||
{
|
||||
vty_out (vty, "Invalid interface %s", VTY_NEWLINE);
|
||||
return CMD_ERR_NO_MATCH;
|
||||
}
|
||||
|
||||
/* FIXME: what is wrong with circuit = ifp->info ? */
|
||||
circuit = circuit_scan_by_ifp (ifp);
|
||||
if (!circuit)
|
||||
{
|
||||
vty_out (vty, "ISIS is not enabled on circuit %s%s",
|
||||
ifp->name, VTY_NEWLINE);
|
||||
return CMD_ERR_NO_MATCH;
|
||||
}
|
||||
|
||||
if (if_is_loopback(ifp))
|
||||
{
|
||||
vty_out (vty, "Can't set no passive for loopback interface%s",
|
||||
VTY_NEWLINE);
|
||||
return CMD_ERR_AMBIGUOUS;
|
||||
}
|
||||
|
||||
if (circuit->is_passive == 0)
|
||||
return CMD_SUCCESS;
|
||||
|
||||
if (circuit->state != C_STATE_UP)
|
||||
{
|
||||
circuit->is_passive = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
struct isis_area *area = circuit->area;
|
||||
isis_csm_state_change (ISIS_DISABLE, circuit, area);
|
||||
circuit->is_passive = 0;
|
||||
isis_csm_state_change (ISIS_ENABLE, circuit, area);
|
||||
}
|
||||
|
||||
return CMD_SUCCESS;
|
||||
if (circuit->circ_type != circ_type)
|
||||
isis_event_circuit_type_change (circuit, circ_type);
|
||||
}
|
||||
|
||||
DEFUN (isis_circuit_type,
|
||||
isis_circuit_type_cmd,
|
||||
"isis circuit-type (level-1|level-1-2|level-2-only)",
|
||||
"IS-IS commands\n"
|
||||
"Configure circuit type for interface\n"
|
||||
"Level-1 only adjacencies are formed\n"
|
||||
"Level-1-2 adjacencies are formed\n"
|
||||
"Level-2 only adjacencies are formed\n")
|
||||
int
|
||||
isis_circuit_metric_set (struct isis_circuit *circuit, int level, int metric)
|
||||
{
|
||||
int circuit_type;
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
assert (level == IS_LEVEL_1 || level == IS_LEVEL_2);
|
||||
if (metric > MAX_WIDE_LINK_METRIC)
|
||||
return -1;
|
||||
if (circuit->area && circuit->area->oldmetric
|
||||
&& metric > MAX_NARROW_LINK_METRIC)
|
||||
return -1;
|
||||
|
||||
circuit_type = string2circuit_t (argv[0]);
|
||||
if (!circuit_type)
|
||||
{
|
||||
vty_out (vty, "Unknown circuit-type %s", VTY_NEWLINE);
|
||||
return CMD_ERR_AMBIGUOUS;
|
||||
}
|
||||
circuit->te_metric[level - 1] = metric;
|
||||
circuit->metrics[level - 1].metric_default = metric;
|
||||
|
||||
if (circuit->state == C_STATE_UP &&
|
||||
circuit->area->is_type != IS_LEVEL_1_AND_2 &&
|
||||
circuit->area->is_type != circuit_type)
|
||||
{
|
||||
vty_out (vty, "Invalid circuit level for area %s.%s",
|
||||
circuit->area->area_tag, VTY_NEWLINE);
|
||||
return CMD_ERR_AMBIGUOUS;
|
||||
}
|
||||
isis_event_circuit_type_change (circuit, circuit_type);
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN (no_isis_circuit_type,
|
||||
no_isis_circuit_type_cmd,
|
||||
"no isis circuit-type (level-1|level-1-2|level-2-only)",
|
||||
NO_STR
|
||||
"IS-IS commands\n"
|
||||
"Configure circuit type for interface\n"
|
||||
"Level-1 only adjacencies are formed\n"
|
||||
"Level-1-2 adjacencies are formed\n"
|
||||
"Level-2 only adjacencies are formed\n")
|
||||
{
|
||||
int circuit_type;
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
/*
|
||||
* Set the circuits level to its default value
|
||||
*/
|
||||
if (circuit->state == C_STATE_UP)
|
||||
circuit_type = circuit->area->is_type;
|
||||
else
|
||||
circuit_type = IS_LEVEL_1_AND_2;
|
||||
isis_event_circuit_type_change (circuit, circuit_type);
|
||||
|
||||
return CMD_SUCCESS;
|
||||
if (circuit->area)
|
||||
lsp_regenerate_schedule (circuit->area, level, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
DEFUN (isis_passwd_md5,
|
||||
@ -1678,387 +1402,6 @@ DEFUN (no_isis_passwd,
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN (isis_priority,
|
||||
isis_priority_cmd,
|
||||
"isis priority <0-127>",
|
||||
"IS-IS commands\n"
|
||||
"Set priority for Designated Router election\n"
|
||||
"Priority value\n")
|
||||
{
|
||||
int prio;
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
prio = atoi (argv[0]);
|
||||
if (prio < MIN_PRIORITY || prio > MAX_PRIORITY)
|
||||
{
|
||||
vty_out (vty, "Invalid priority %d - should be <0-127>%s",
|
||||
prio, VTY_NEWLINE);
|
||||
return CMD_ERR_AMBIGUOUS;
|
||||
}
|
||||
|
||||
circuit->priority[0] = prio;
|
||||
circuit->priority[1] = prio;
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN (no_isis_priority,
|
||||
no_isis_priority_cmd,
|
||||
"no isis priority",
|
||||
NO_STR
|
||||
"IS-IS commands\n"
|
||||
"Set priority for Designated Router election\n")
|
||||
{
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
circuit->priority[0] = DEFAULT_PRIORITY;
|
||||
circuit->priority[1] = DEFAULT_PRIORITY;
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
ALIAS (no_isis_priority,
|
||||
no_isis_priority_arg_cmd,
|
||||
"no isis priority <0-127>",
|
||||
NO_STR
|
||||
"IS-IS commands\n"
|
||||
"Set priority for Designated Router election\n"
|
||||
"Priority value\n")
|
||||
|
||||
DEFUN (isis_priority_l1,
|
||||
isis_priority_l1_cmd,
|
||||
"isis priority <0-127> level-1",
|
||||
"IS-IS commands\n"
|
||||
"Set priority for Designated Router election\n"
|
||||
"Priority value\n"
|
||||
"Specify priority for level-1 routing\n")
|
||||
{
|
||||
int prio;
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
prio = atoi (argv[0]);
|
||||
if (prio < MIN_PRIORITY || prio > MAX_PRIORITY)
|
||||
{
|
||||
vty_out (vty, "Invalid priority %d - should be <0-127>%s",
|
||||
prio, VTY_NEWLINE);
|
||||
return CMD_ERR_AMBIGUOUS;
|
||||
}
|
||||
|
||||
circuit->priority[0] = prio;
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN (no_isis_priority_l1,
|
||||
no_isis_priority_l1_cmd,
|
||||
"no isis priority level-1",
|
||||
NO_STR
|
||||
"IS-IS commands\n"
|
||||
"Set priority for Designated Router election\n"
|
||||
"Specify priority for level-1 routing\n")
|
||||
{
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
circuit->priority[0] = DEFAULT_PRIORITY;
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
ALIAS (no_isis_priority_l1,
|
||||
no_isis_priority_l1_arg_cmd,
|
||||
"no isis priority <0-127> level-1",
|
||||
NO_STR
|
||||
"IS-IS commands\n"
|
||||
"Set priority for Designated Router election\n"
|
||||
"Priority value\n"
|
||||
"Specify priority for level-1 routing\n")
|
||||
|
||||
DEFUN (isis_priority_l2,
|
||||
isis_priority_l2_cmd,
|
||||
"isis priority <0-127> level-2",
|
||||
"IS-IS commands\n"
|
||||
"Set priority for Designated Router election\n"
|
||||
"Priority value\n"
|
||||
"Specify priority for level-2 routing\n")
|
||||
{
|
||||
int prio;
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
prio = atoi (argv[0]);
|
||||
if (prio < MIN_PRIORITY || prio > MAX_PRIORITY)
|
||||
{
|
||||
vty_out (vty, "Invalid priority %d - should be <0-127>%s",
|
||||
prio, VTY_NEWLINE);
|
||||
return CMD_ERR_AMBIGUOUS;
|
||||
}
|
||||
|
||||
circuit->priority[1] = prio;
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN (no_isis_priority_l2,
|
||||
no_isis_priority_l2_cmd,
|
||||
"no isis priority level-2",
|
||||
NO_STR
|
||||
"IS-IS commands\n"
|
||||
"Set priority for Designated Router election\n"
|
||||
"Specify priority for level-2 routing\n")
|
||||
{
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
circuit->priority[1] = DEFAULT_PRIORITY;
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
ALIAS (no_isis_priority_l2,
|
||||
no_isis_priority_l2_arg_cmd,
|
||||
"no isis priority <0-127> level-2",
|
||||
NO_STR
|
||||
"IS-IS commands\n"
|
||||
"Set priority for Designated Router election\n"
|
||||
"Priority value\n"
|
||||
"Specify priority for level-2 routing\n")
|
||||
|
||||
/* Metric command */
|
||||
DEFUN (isis_metric,
|
||||
isis_metric_cmd,
|
||||
"isis metric <0-16777215>",
|
||||
"IS-IS commands\n"
|
||||
"Set default metric for circuit\n"
|
||||
"Default metric value\n")
|
||||
{
|
||||
int met;
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
met = atoi (argv[0]);
|
||||
|
||||
/* RFC3787 section 5.1 */
|
||||
if (circuit->area && circuit->area->oldmetric == 1 &&
|
||||
met > MAX_NARROW_LINK_METRIC)
|
||||
{
|
||||
vty_out (vty, "Invalid metric %d - should be <0-63> "
|
||||
"when narrow metric type enabled%s",
|
||||
met, VTY_NEWLINE);
|
||||
return CMD_ERR_AMBIGUOUS;
|
||||
}
|
||||
|
||||
/* RFC4444 */
|
||||
if (circuit->area && circuit->area->newmetric == 1 &&
|
||||
met > MAX_WIDE_LINK_METRIC)
|
||||
{
|
||||
vty_out (vty, "Invalid metric %d - should be <0-16777215> "
|
||||
"when wide metric type enabled%s",
|
||||
met, VTY_NEWLINE);
|
||||
return CMD_ERR_AMBIGUOUS;
|
||||
}
|
||||
|
||||
circuit->te_metric[0] = met;
|
||||
circuit->te_metric[1] = met;
|
||||
|
||||
circuit->metrics[0].metric_default = met;
|
||||
circuit->metrics[1].metric_default = met;
|
||||
|
||||
if (circuit->area)
|
||||
lsp_regenerate_schedule (circuit->area, circuit->is_type, 0);
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN (no_isis_metric,
|
||||
no_isis_metric_cmd,
|
||||
"no isis metric",
|
||||
NO_STR
|
||||
"IS-IS commands\n"
|
||||
"Set default metric for circuit\n")
|
||||
{
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
circuit->te_metric[0] = DEFAULT_CIRCUIT_METRIC;
|
||||
circuit->te_metric[1] = DEFAULT_CIRCUIT_METRIC;
|
||||
circuit->metrics[0].metric_default = DEFAULT_CIRCUIT_METRIC;
|
||||
circuit->metrics[1].metric_default = DEFAULT_CIRCUIT_METRIC;
|
||||
|
||||
if (circuit->area)
|
||||
lsp_regenerate_schedule (circuit->area, circuit->is_type, 0);
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
ALIAS (no_isis_metric,
|
||||
no_isis_metric_arg_cmd,
|
||||
"no isis metric <0-16777215>",
|
||||
NO_STR
|
||||
"IS-IS commands\n"
|
||||
"Set default metric for circuit\n"
|
||||
"Default metric value\n")
|
||||
|
||||
DEFUN (isis_metric_l1,
|
||||
isis_metric_l1_cmd,
|
||||
"isis metric <0-16777215> level-1",
|
||||
"IS-IS commands\n"
|
||||
"Set default metric for circuit\n"
|
||||
"Default metric value\n"
|
||||
"Specify metric for level-1 routing\n")
|
||||
{
|
||||
int met;
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
met = atoi (argv[0]);
|
||||
|
||||
/* RFC3787 section 5.1 */
|
||||
if (circuit->area && circuit->area->oldmetric == 1 &&
|
||||
met > MAX_NARROW_LINK_METRIC)
|
||||
{
|
||||
vty_out (vty, "Invalid metric %d - should be <0-63> "
|
||||
"when narrow metric type enabled%s",
|
||||
met, VTY_NEWLINE);
|
||||
return CMD_ERR_AMBIGUOUS;
|
||||
}
|
||||
|
||||
/* RFC4444 */
|
||||
if (circuit->area && circuit->area->newmetric == 1 &&
|
||||
met > MAX_WIDE_LINK_METRIC)
|
||||
{
|
||||
vty_out (vty, "Invalid metric %d - should be <0-16777215> "
|
||||
"when wide metric type enabled%s",
|
||||
met, VTY_NEWLINE);
|
||||
return CMD_ERR_AMBIGUOUS;
|
||||
}
|
||||
|
||||
circuit->te_metric[0] = met;
|
||||
circuit->metrics[0].metric_default = met;
|
||||
|
||||
if (circuit->area)
|
||||
lsp_regenerate_schedule (circuit->area, IS_LEVEL_1, 0);
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN (no_isis_metric_l1,
|
||||
no_isis_metric_l1_cmd,
|
||||
"no isis metric level-1",
|
||||
NO_STR
|
||||
"IS-IS commands\n"
|
||||
"Set default metric for circuit\n"
|
||||
"Specify metric for level-1 routing\n")
|
||||
{
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
circuit->te_metric[0] = DEFAULT_CIRCUIT_METRIC;
|
||||
circuit->metrics[0].metric_default = DEFAULT_CIRCUIT_METRIC;
|
||||
|
||||
if (circuit->area)
|
||||
lsp_regenerate_schedule (circuit->area, IS_LEVEL_1, 0);
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
ALIAS (no_isis_metric_l1,
|
||||
no_isis_metric_l1_arg_cmd,
|
||||
"no isis metric <0-16777215> level-1",
|
||||
NO_STR
|
||||
"IS-IS commands\n"
|
||||
"Set default metric for circuit\n"
|
||||
"Default metric value\n"
|
||||
"Specify metric for level-1 routing\n")
|
||||
|
||||
DEFUN (isis_metric_l2,
|
||||
isis_metric_l2_cmd,
|
||||
"isis metric <0-16777215> level-2",
|
||||
"IS-IS commands\n"
|
||||
"Set default metric for circuit\n"
|
||||
"Default metric value\n"
|
||||
"Specify metric for level-2 routing\n")
|
||||
{
|
||||
int met;
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
met = atoi (argv[0]);
|
||||
|
||||
/* RFC3787 section 5.1 */
|
||||
if (circuit->area && circuit->area->oldmetric == 1 &&
|
||||
met > MAX_NARROW_LINK_METRIC)
|
||||
{
|
||||
vty_out (vty, "Invalid metric %d - should be <0-63> "
|
||||
"when narrow metric type enabled%s",
|
||||
met, VTY_NEWLINE);
|
||||
return CMD_ERR_AMBIGUOUS;
|
||||
}
|
||||
|
||||
/* RFC4444 */
|
||||
if (circuit->area && circuit->area->newmetric == 1 &&
|
||||
met > MAX_WIDE_LINK_METRIC)
|
||||
{
|
||||
vty_out (vty, "Invalid metric %d - should be <0-16777215> "
|
||||
"when wide metric type enabled%s",
|
||||
met, VTY_NEWLINE);
|
||||
return CMD_ERR_AMBIGUOUS;
|
||||
}
|
||||
|
||||
circuit->te_metric[1] = met;
|
||||
circuit->metrics[1].metric_default = met;
|
||||
|
||||
if (circuit->area)
|
||||
lsp_regenerate_schedule (circuit->area, IS_LEVEL_2, 0);
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN (no_isis_metric_l2,
|
||||
no_isis_metric_l2_cmd,
|
||||
"no isis metric level-2",
|
||||
NO_STR
|
||||
"IS-IS commands\n"
|
||||
"Set default metric for circuit\n"
|
||||
"Specify metric for level-2 routing\n")
|
||||
{
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
circuit->te_metric[1] = DEFAULT_CIRCUIT_METRIC;
|
||||
circuit->metrics[1].metric_default = DEFAULT_CIRCUIT_METRIC;
|
||||
|
||||
if (circuit->area)
|
||||
lsp_regenerate_schedule (circuit->area, IS_LEVEL_2, 0);
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
ALIAS (no_isis_metric_l2,
|
||||
no_isis_metric_l2_arg_cmd,
|
||||
"no isis metric <0-16777215> level-2",
|
||||
NO_STR
|
||||
"IS-IS commands\n"
|
||||
"Set default metric for circuit\n"
|
||||
"Default metric value\n"
|
||||
"Specify metric for level-2 routing\n")
|
||||
/* end of metrics */
|
||||
|
||||
DEFUN (isis_hello_interval,
|
||||
isis_hello_interval_cmd,
|
||||
"isis hello-interval <1-600>",
|
||||
@ -2726,86 +2069,43 @@ struct cmd_node interface_node = {
|
||||
1,
|
||||
};
|
||||
|
||||
DEFUN (isis_network,
|
||||
isis_network_cmd,
|
||||
"isis network point-to-point",
|
||||
"IS-IS commands\n"
|
||||
"Set network type\n"
|
||||
"point-to-point network type\n")
|
||||
int
|
||||
isis_circuit_circ_type_set(struct isis_circuit *circuit, int circ_type)
|
||||
{
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
/* Changing the network type to/of loopback or unknown interfaces
|
||||
* is not supported. */
|
||||
if (circ_type == CIRCUIT_T_UNKNOWN
|
||||
|| circ_type == CIRCUIT_T_LOOPBACK
|
||||
|| circuit->circ_type == CIRCUIT_T_UNKNOWN
|
||||
|| circuit->circ_type == CIRCUIT_T_LOOPBACK)
|
||||
{
|
||||
if (circuit->circ_type != circ_type)
|
||||
return -1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* RFC5309 section 4 */
|
||||
if (circuit->circ_type == CIRCUIT_T_P2P)
|
||||
return CMD_SUCCESS;
|
||||
if (circuit->circ_type == circ_type)
|
||||
return 0;
|
||||
|
||||
if (circuit->state != C_STATE_UP)
|
||||
{
|
||||
circuit->circ_type = CIRCUIT_T_P2P;
|
||||
circuit->circ_type_config = CIRCUIT_T_P2P;
|
||||
circuit->circ_type = circ_type;
|
||||
circuit->circ_type_config = circ_type;
|
||||
}
|
||||
else
|
||||
{
|
||||
struct isis_area *area = circuit->area;
|
||||
if (!if_is_broadcast (circuit->interface))
|
||||
{
|
||||
vty_out (vty, "isis network point-to-point "
|
||||
"is valid only on broadcast interfaces%s",
|
||||
VTY_NEWLINE);
|
||||
return CMD_ERR_AMBIGUOUS;
|
||||
}
|
||||
if (circ_type == CIRCUIT_T_BROADCAST
|
||||
&& !if_is_broadcast(circuit->interface))
|
||||
return -1;
|
||||
|
||||
isis_csm_state_change (ISIS_DISABLE, circuit, area);
|
||||
circuit->circ_type = CIRCUIT_T_P2P;
|
||||
circuit->circ_type_config = CIRCUIT_T_P2P;
|
||||
isis_csm_state_change (ISIS_ENABLE, circuit, area);
|
||||
isis_csm_state_change(ISIS_DISABLE, circuit, area);
|
||||
circuit->circ_type = circ_type;
|
||||
circuit->circ_type_config = circ_type;
|
||||
isis_csm_state_change(ISIS_ENABLE, circuit, area);
|
||||
}
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN (no_isis_network,
|
||||
no_isis_network_cmd,
|
||||
"no isis network point-to-point",
|
||||
NO_STR
|
||||
"IS-IS commands\n"
|
||||
"Set network type for circuit\n"
|
||||
"point-to-point network type\n")
|
||||
{
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
/* RFC5309 section 4 */
|
||||
if (circuit->circ_type == CIRCUIT_T_BROADCAST)
|
||||
return CMD_SUCCESS;
|
||||
|
||||
if (circuit->state != C_STATE_UP)
|
||||
{
|
||||
circuit->circ_type = CIRCUIT_T_BROADCAST;
|
||||
circuit->circ_type_config = CIRCUIT_T_BROADCAST;
|
||||
}
|
||||
else
|
||||
{
|
||||
struct isis_area *area = circuit->area;
|
||||
if (circuit->interface &&
|
||||
!if_is_broadcast (circuit->interface))
|
||||
{
|
||||
vty_out (vty, "no isis network point-to-point "
|
||||
"is valid only on broadcast interfaces%s",
|
||||
VTY_NEWLINE);
|
||||
return CMD_ERR_AMBIGUOUS;
|
||||
}
|
||||
|
||||
isis_csm_state_change (ISIS_DISABLE, circuit, area);
|
||||
circuit->circ_type = CIRCUIT_T_BROADCAST;
|
||||
circuit->circ_type_config = CIRCUIT_T_BROADCAST;
|
||||
isis_csm_state_change (ISIS_ENABLE, circuit, area);
|
||||
}
|
||||
|
||||
return CMD_SUCCESS;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
@ -2845,39 +2145,10 @@ isis_circuit_init ()
|
||||
install_element (INTERFACE_NODE, &interface_desc_cmd);
|
||||
install_element (INTERFACE_NODE, &no_interface_desc_cmd);
|
||||
|
||||
install_element (INTERFACE_NODE, &ip_router_isis_cmd);
|
||||
install_element (INTERFACE_NODE, &no_ip_router_isis_cmd);
|
||||
|
||||
install_element (INTERFACE_NODE, &isis_passive_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_passive_cmd);
|
||||
|
||||
install_element (INTERFACE_NODE, &isis_circuit_type_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_circuit_type_cmd);
|
||||
|
||||
install_element (INTERFACE_NODE, &isis_passwd_clear_cmd);
|
||||
install_element (INTERFACE_NODE, &isis_passwd_md5_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_passwd_cmd);
|
||||
|
||||
install_element (INTERFACE_NODE, &isis_priority_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_priority_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_priority_arg_cmd);
|
||||
install_element (INTERFACE_NODE, &isis_priority_l1_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_priority_l1_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_priority_l1_arg_cmd);
|
||||
install_element (INTERFACE_NODE, &isis_priority_l2_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_priority_l2_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_priority_l2_arg_cmd);
|
||||
|
||||
install_element (INTERFACE_NODE, &isis_metric_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_metric_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_metric_arg_cmd);
|
||||
install_element (INTERFACE_NODE, &isis_metric_l1_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_metric_l1_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_metric_l1_arg_cmd);
|
||||
install_element (INTERFACE_NODE, &isis_metric_l2_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_metric_l2_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_metric_l2_arg_cmd);
|
||||
|
||||
install_element (INTERFACE_NODE, &isis_hello_interval_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_hello_interval_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_hello_interval_arg_cmd);
|
||||
@ -2921,11 +2192,5 @@ isis_circuit_init ()
|
||||
install_element (INTERFACE_NODE, &no_psnp_interval_l2_cmd);
|
||||
install_element (INTERFACE_NODE, &no_psnp_interval_l2_arg_cmd);
|
||||
|
||||
install_element (INTERFACE_NODE, &isis_network_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_network_cmd);
|
||||
|
||||
#ifdef HAVE_IPV6
|
||||
install_element (INTERFACE_NODE, &ipv6_router_isis_cmd);
|
||||
install_element (INTERFACE_NODE, &no_ipv6_router_isis_cmd);
|
||||
#endif
|
||||
isis_vty_init ();
|
||||
}
|
||||
|
@ -24,6 +24,10 @@
|
||||
#define ISIS_CIRCUIT_H
|
||||
|
||||
#include "vty.h"
|
||||
#include "if.h"
|
||||
|
||||
#include "isis_constants.h"
|
||||
#include "isis_common.h"
|
||||
|
||||
#define CIRCUIT_MAX 255
|
||||
|
||||
@ -167,4 +171,12 @@ void isis_circuit_print_vty (struct isis_circuit *circuit, struct vty *vty,
|
||||
size_t isis_circuit_pdu_size(struct isis_circuit *circuit);
|
||||
void isis_circuit_stream(struct isis_circuit *circuit, struct stream **stream);
|
||||
|
||||
struct isis_circuit *isis_circuit_create (struct isis_area *area, struct interface *ifp);
|
||||
void isis_circuit_af_set (struct isis_circuit *circuit, bool ip_router, bool ipv6_router);
|
||||
int isis_circuit_passive_set (struct isis_circuit *circuit, bool passive);
|
||||
void isis_circuit_is_type_set (struct isis_circuit *circuit, int is_type);
|
||||
int isis_circuit_circ_type_set (struct isis_circuit *circuit, int circ_type);
|
||||
|
||||
int isis_circuit_metric_set (struct isis_circuit *circuit, int level, int metric);
|
||||
|
||||
#endif /* _ZEBRA_ISIS_CIRCUIT_H */
|
||||
|
@ -44,6 +44,7 @@ struct isis_redist
|
||||
|
||||
struct isis_area;
|
||||
struct prefix;
|
||||
struct vty;
|
||||
|
||||
struct route_table *get_ext_reach(struct isis_area *area,
|
||||
int family, int level);
|
||||
|
678
isisd/isis_vty.c
Normal file
678
isisd/isis_vty.c
Normal file
@ -0,0 +1,678 @@
|
||||
/*
|
||||
* IS-IS Rout(e)ing protocol - isis_circuit.h
|
||||
*
|
||||
* Copyright (C) 2001,2002 Sampo Saaristo
|
||||
* Tampere University of Technology
|
||||
* Institute of Communications Engineering
|
||||
* Copyright (C) 2016 David Lamparter, for NetDEF, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public Licenseas published by the Free
|
||||
* Software Foundation; either version 2 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include <zebra.h>
|
||||
#include <command.h>
|
||||
|
||||
#include "isis_circuit.h"
|
||||
#include "isis_csm.h"
|
||||
#include "isis_misc.h"
|
||||
#include "isisd.h"
|
||||
|
||||
static struct isis_circuit *
|
||||
isis_circuit_lookup (struct vty *vty)
|
||||
{
|
||||
struct interface *ifp;
|
||||
struct isis_circuit *circuit;
|
||||
|
||||
ifp = (struct interface *) vty->index;
|
||||
if (!ifp)
|
||||
{
|
||||
vty_out (vty, "Invalid interface %s", VTY_NEWLINE);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
circuit = circuit_scan_by_ifp (ifp);
|
||||
if (!circuit)
|
||||
{
|
||||
vty_out (vty, "ISIS is not enabled on circuit %s%s",
|
||||
ifp->name, VTY_NEWLINE);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return circuit;
|
||||
}
|
||||
|
||||
DEFUN (ip_router_isis,
|
||||
ip_router_isis_cmd,
|
||||
"(ip|ipv6) router isis WORD",
|
||||
"Interface Internet Protocol config commands\n"
|
||||
"IP router interface commands\n"
|
||||
"IS-IS Routing for IP\n"
|
||||
"Routing process tag\n")
|
||||
{
|
||||
struct interface *ifp;
|
||||
struct isis_circuit *circuit;
|
||||
struct isis_area *area;
|
||||
const char *af = argv[0];
|
||||
const char *area_tag = argv[1];
|
||||
|
||||
ifp = (struct interface *) vty->index;
|
||||
assert (ifp);
|
||||
|
||||
/* Prevent more than one area per circuit */
|
||||
circuit = circuit_scan_by_ifp (ifp);
|
||||
if (circuit)
|
||||
{
|
||||
if (circuit->ip_router == 1)
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
area = isis_area_lookup (area_tag);
|
||||
if (!area)
|
||||
area = isis_area_create (area_tag);
|
||||
|
||||
if (!circuit)
|
||||
circuit = isis_circuit_create (area, ifp);
|
||||
|
||||
bool ip = circuit->ip_router, ipv6 = circuit->ipv6_router;
|
||||
if (af[2] != '\0')
|
||||
ipv6 = true;
|
||||
else
|
||||
ip = true;
|
||||
|
||||
isis_circuit_af_set (circuit, ip, ipv6);
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN (no_ip_router_isis,
|
||||
no_ip_router_isis_cmd,
|
||||
"no (ip|ipv6) router isis WORD",
|
||||
NO_STR
|
||||
"Interface Internet Protocol config commands\n"
|
||||
"IP router interface commands\n"
|
||||
"IS-IS Routing for IP\n"
|
||||
"Routing process tag\n")
|
||||
{
|
||||
struct interface *ifp;
|
||||
struct isis_area *area;
|
||||
struct isis_circuit *circuit;
|
||||
const char *af = argv[0];
|
||||
const char *area_tag = argv[1];
|
||||
|
||||
ifp = (struct interface *) vty->index;
|
||||
if (!ifp)
|
||||
{
|
||||
vty_out (vty, "Invalid interface %s", VTY_NEWLINE);
|
||||
return CMD_ERR_NO_MATCH;
|
||||
}
|
||||
|
||||
area = isis_area_lookup (area_tag);
|
||||
if (!area)
|
||||
{
|
||||
vty_out (vty, "Can't find ISIS instance %s%s",
|
||||
argv[0], VTY_NEWLINE);
|
||||
return CMD_ERR_NO_MATCH;
|
||||
}
|
||||
|
||||
circuit = circuit_lookup_by_ifp (ifp, area->circuit_list);
|
||||
if (!circuit)
|
||||
{
|
||||
vty_out (vty, "ISIS is not enabled on circuit %s%s",
|
||||
ifp->name, VTY_NEWLINE);
|
||||
return CMD_ERR_NO_MATCH;
|
||||
}
|
||||
|
||||
bool ip = circuit->ip_router, ipv6 = circuit->ipv6_router;
|
||||
if (af[2] != '\0')
|
||||
ipv6 = false;
|
||||
else
|
||||
ip = false;
|
||||
|
||||
isis_circuit_af_set (circuit, ip, ipv6);
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN (isis_passive,
|
||||
isis_passive_cmd,
|
||||
"isis passive",
|
||||
"IS-IS commands\n"
|
||||
"Configure the passive mode for interface\n")
|
||||
{
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
isis_circuit_passive_set (circuit, 1);
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN (no_isis_passive,
|
||||
no_isis_passive_cmd,
|
||||
"no isis passive",
|
||||
NO_STR
|
||||
"IS-IS commands\n"
|
||||
"Configure the passive mode for interface\n")
|
||||
{
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
if (if_is_loopback (circuit->interface))
|
||||
{
|
||||
vty_out (vty, "Can't set no passive for loopback interface%s",
|
||||
VTY_NEWLINE);
|
||||
return CMD_ERR_AMBIGUOUS;
|
||||
}
|
||||
|
||||
isis_circuit_passive_set (circuit, 0);
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN (isis_circuit_type,
|
||||
isis_circuit_type_cmd,
|
||||
"isis circuit-type (level-1|level-1-2|level-2-only)",
|
||||
"IS-IS commands\n"
|
||||
"Configure circuit type for interface\n"
|
||||
"Level-1 only adjacencies are formed\n"
|
||||
"Level-1-2 adjacencies are formed\n"
|
||||
"Level-2 only adjacencies are formed\n")
|
||||
{
|
||||
int is_type;
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
is_type = string2circuit_t (argv[0]);
|
||||
if (!is_type)
|
||||
{
|
||||
vty_out (vty, "Unknown circuit-type %s", VTY_NEWLINE);
|
||||
return CMD_ERR_AMBIGUOUS;
|
||||
}
|
||||
|
||||
if (circuit->state == C_STATE_UP &&
|
||||
circuit->area->is_type != IS_LEVEL_1_AND_2 &&
|
||||
circuit->area->is_type != is_type)
|
||||
{
|
||||
vty_out (vty, "Invalid circuit level for area %s.%s",
|
||||
circuit->area->area_tag, VTY_NEWLINE);
|
||||
return CMD_ERR_AMBIGUOUS;
|
||||
}
|
||||
isis_circuit_is_type_set (circuit, is_type);
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN (no_isis_circuit_type,
|
||||
no_isis_circuit_type_cmd,
|
||||
"no isis circuit-type (level-1|level-1-2|level-2-only)",
|
||||
NO_STR
|
||||
"IS-IS commands\n"
|
||||
"Configure circuit type for interface\n"
|
||||
"Level-1 only adjacencies are formed\n"
|
||||
"Level-1-2 adjacencies are formed\n"
|
||||
"Level-2 only adjacencies are formed\n")
|
||||
{
|
||||
int is_type;
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
/*
|
||||
* Set the circuits level to its default value
|
||||
*/
|
||||
if (circuit->state == C_STATE_UP)
|
||||
is_type = circuit->area->is_type;
|
||||
else
|
||||
is_type = IS_LEVEL_1_AND_2;
|
||||
isis_circuit_is_type_set (circuit, is_type);
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN (isis_network,
|
||||
isis_network_cmd,
|
||||
"isis network point-to-point",
|
||||
"IS-IS commands\n"
|
||||
"Set network type\n"
|
||||
"point-to-point network type\n")
|
||||
{
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
if (!isis_circuit_circ_type_set(circuit, CIRCUIT_T_P2P))
|
||||
{
|
||||
vty_out (vty, "isis network point-to-point "
|
||||
"is valid only on broadcast interfaces%s",
|
||||
VTY_NEWLINE);
|
||||
return CMD_ERR_AMBIGUOUS;
|
||||
}
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN (no_isis_network,
|
||||
no_isis_network_cmd,
|
||||
"no isis network point-to-point",
|
||||
NO_STR
|
||||
"IS-IS commands\n"
|
||||
"Set network type for circuit\n"
|
||||
"point-to-point network type\n")
|
||||
{
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
if (!isis_circuit_circ_type_set(circuit, CIRCUIT_T_BROADCAST))
|
||||
{
|
||||
vty_out (vty, "isis network point-to-point "
|
||||
"is valid only on broadcast interfaces%s",
|
||||
VTY_NEWLINE);
|
||||
return CMD_ERR_AMBIGUOUS;
|
||||
}
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN (isis_priority,
|
||||
isis_priority_cmd,
|
||||
"isis priority <0-127>",
|
||||
"IS-IS commands\n"
|
||||
"Set priority for Designated Router election\n"
|
||||
"Priority value\n")
|
||||
{
|
||||
int prio;
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
prio = atoi (argv[0]);
|
||||
if (prio < MIN_PRIORITY || prio > MAX_PRIORITY)
|
||||
{
|
||||
vty_out (vty, "Invalid priority %d - should be <0-127>%s",
|
||||
prio, VTY_NEWLINE);
|
||||
return CMD_ERR_AMBIGUOUS;
|
||||
}
|
||||
|
||||
circuit->priority[0] = prio;
|
||||
circuit->priority[1] = prio;
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN (no_isis_priority,
|
||||
no_isis_priority_cmd,
|
||||
"no isis priority",
|
||||
NO_STR
|
||||
"IS-IS commands\n"
|
||||
"Set priority for Designated Router election\n")
|
||||
{
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
circuit->priority[0] = DEFAULT_PRIORITY;
|
||||
circuit->priority[1] = DEFAULT_PRIORITY;
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
ALIAS (no_isis_priority,
|
||||
no_isis_priority_arg_cmd,
|
||||
"no isis priority <0-127>",
|
||||
NO_STR
|
||||
"IS-IS commands\n"
|
||||
"Set priority for Designated Router election\n"
|
||||
"Priority value\n")
|
||||
|
||||
DEFUN (isis_priority_l1,
|
||||
isis_priority_l1_cmd,
|
||||
"isis priority <0-127> level-1",
|
||||
"IS-IS commands\n"
|
||||
"Set priority for Designated Router election\n"
|
||||
"Priority value\n"
|
||||
"Specify priority for level-1 routing\n")
|
||||
{
|
||||
int prio;
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
prio = atoi (argv[0]);
|
||||
if (prio < MIN_PRIORITY || prio > MAX_PRIORITY)
|
||||
{
|
||||
vty_out (vty, "Invalid priority %d - should be <0-127>%s",
|
||||
prio, VTY_NEWLINE);
|
||||
return CMD_ERR_AMBIGUOUS;
|
||||
}
|
||||
|
||||
circuit->priority[0] = prio;
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN (no_isis_priority_l1,
|
||||
no_isis_priority_l1_cmd,
|
||||
"no isis priority level-1",
|
||||
NO_STR
|
||||
"IS-IS commands\n"
|
||||
"Set priority for Designated Router election\n"
|
||||
"Specify priority for level-1 routing\n")
|
||||
{
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
circuit->priority[0] = DEFAULT_PRIORITY;
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
ALIAS (no_isis_priority_l1,
|
||||
no_isis_priority_l1_arg_cmd,
|
||||
"no isis priority <0-127> level-1",
|
||||
NO_STR
|
||||
"IS-IS commands\n"
|
||||
"Set priority for Designated Router election\n"
|
||||
"Priority value\n"
|
||||
"Specify priority for level-1 routing\n")
|
||||
|
||||
DEFUN (isis_priority_l2,
|
||||
isis_priority_l2_cmd,
|
||||
"isis priority <0-127> level-2",
|
||||
"IS-IS commands\n"
|
||||
"Set priority for Designated Router election\n"
|
||||
"Priority value\n"
|
||||
"Specify priority for level-2 routing\n")
|
||||
{
|
||||
int prio;
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
prio = atoi (argv[0]);
|
||||
if (prio < MIN_PRIORITY || prio > MAX_PRIORITY)
|
||||
{
|
||||
vty_out (vty, "Invalid priority %d - should be <0-127>%s",
|
||||
prio, VTY_NEWLINE);
|
||||
return CMD_ERR_AMBIGUOUS;
|
||||
}
|
||||
|
||||
circuit->priority[1] = prio;
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN (no_isis_priority_l2,
|
||||
no_isis_priority_l2_cmd,
|
||||
"no isis priority level-2",
|
||||
NO_STR
|
||||
"IS-IS commands\n"
|
||||
"Set priority for Designated Router election\n"
|
||||
"Specify priority for level-2 routing\n")
|
||||
{
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
circuit->priority[1] = DEFAULT_PRIORITY;
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
ALIAS (no_isis_priority_l2,
|
||||
no_isis_priority_l2_arg_cmd,
|
||||
"no isis priority <0-127> level-2",
|
||||
NO_STR
|
||||
"IS-IS commands\n"
|
||||
"Set priority for Designated Router election\n"
|
||||
"Priority value\n"
|
||||
"Specify priority for level-2 routing\n")
|
||||
|
||||
/* Metric command */
|
||||
DEFUN (isis_metric,
|
||||
isis_metric_cmd,
|
||||
"isis metric <0-16777215>",
|
||||
"IS-IS commands\n"
|
||||
"Set default metric for circuit\n"
|
||||
"Default metric value\n")
|
||||
{
|
||||
int met;
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
met = atoi (argv[0]);
|
||||
|
||||
/* RFC3787 section 5.1 */
|
||||
if (circuit->area && circuit->area->oldmetric == 1 &&
|
||||
met > MAX_NARROW_LINK_METRIC)
|
||||
{
|
||||
vty_out (vty, "Invalid metric %d - should be <0-63> "
|
||||
"when narrow metric type enabled%s",
|
||||
met, VTY_NEWLINE);
|
||||
return CMD_ERR_AMBIGUOUS;
|
||||
}
|
||||
|
||||
/* RFC4444 */
|
||||
if (circuit->area && circuit->area->newmetric == 1 &&
|
||||
met > MAX_WIDE_LINK_METRIC)
|
||||
{
|
||||
vty_out (vty, "Invalid metric %d - should be <0-16777215> "
|
||||
"when wide metric type enabled%s",
|
||||
met, VTY_NEWLINE);
|
||||
return CMD_ERR_AMBIGUOUS;
|
||||
}
|
||||
|
||||
isis_circuit_metric_set (circuit, IS_LEVEL_1, met);
|
||||
isis_circuit_metric_set (circuit, IS_LEVEL_2, met);
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN (no_isis_metric,
|
||||
no_isis_metric_cmd,
|
||||
"no isis metric",
|
||||
NO_STR
|
||||
"IS-IS commands\n"
|
||||
"Set default metric for circuit\n")
|
||||
{
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
isis_circuit_metric_set (circuit, IS_LEVEL_1, DEFAULT_CIRCUIT_METRIC);
|
||||
isis_circuit_metric_set (circuit, IS_LEVEL_2, DEFAULT_CIRCUIT_METRIC);
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
ALIAS (no_isis_metric,
|
||||
no_isis_metric_arg_cmd,
|
||||
"no isis metric <0-16777215>",
|
||||
NO_STR
|
||||
"IS-IS commands\n"
|
||||
"Set default metric for circuit\n"
|
||||
"Default metric value\n")
|
||||
|
||||
DEFUN (isis_metric_l1,
|
||||
isis_metric_l1_cmd,
|
||||
"isis metric <0-16777215> level-1",
|
||||
"IS-IS commands\n"
|
||||
"Set default metric for circuit\n"
|
||||
"Default metric value\n"
|
||||
"Specify metric for level-1 routing\n")
|
||||
{
|
||||
int met;
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
met = atoi (argv[0]);
|
||||
|
||||
/* RFC3787 section 5.1 */
|
||||
if (circuit->area && circuit->area->oldmetric == 1 &&
|
||||
met > MAX_NARROW_LINK_METRIC)
|
||||
{
|
||||
vty_out (vty, "Invalid metric %d - should be <0-63> "
|
||||
"when narrow metric type enabled%s",
|
||||
met, VTY_NEWLINE);
|
||||
return CMD_ERR_AMBIGUOUS;
|
||||
}
|
||||
|
||||
/* RFC4444 */
|
||||
if (circuit->area && circuit->area->newmetric == 1 &&
|
||||
met > MAX_WIDE_LINK_METRIC)
|
||||
{
|
||||
vty_out (vty, "Invalid metric %d - should be <0-16777215> "
|
||||
"when wide metric type enabled%s",
|
||||
met, VTY_NEWLINE);
|
||||
return CMD_ERR_AMBIGUOUS;
|
||||
}
|
||||
|
||||
isis_circuit_metric_set (circuit, IS_LEVEL_1, met);
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN (no_isis_metric_l1,
|
||||
no_isis_metric_l1_cmd,
|
||||
"no isis metric level-1",
|
||||
NO_STR
|
||||
"IS-IS commands\n"
|
||||
"Set default metric for circuit\n"
|
||||
"Specify metric for level-1 routing\n")
|
||||
{
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
isis_circuit_metric_set (circuit, IS_LEVEL_1, DEFAULT_CIRCUIT_METRIC);
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
ALIAS (no_isis_metric_l1,
|
||||
no_isis_metric_l1_arg_cmd,
|
||||
"no isis metric <0-16777215> level-1",
|
||||
NO_STR
|
||||
"IS-IS commands\n"
|
||||
"Set default metric for circuit\n"
|
||||
"Default metric value\n"
|
||||
"Specify metric for level-1 routing\n")
|
||||
|
||||
DEFUN (isis_metric_l2,
|
||||
isis_metric_l2_cmd,
|
||||
"isis metric <0-16777215> level-2",
|
||||
"IS-IS commands\n"
|
||||
"Set default metric for circuit\n"
|
||||
"Default metric value\n"
|
||||
"Specify metric for level-2 routing\n")
|
||||
{
|
||||
int met;
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
met = atoi (argv[0]);
|
||||
|
||||
/* RFC3787 section 5.1 */
|
||||
if (circuit->area && circuit->area->oldmetric == 1 &&
|
||||
met > MAX_NARROW_LINK_METRIC)
|
||||
{
|
||||
vty_out (vty, "Invalid metric %d - should be <0-63> "
|
||||
"when narrow metric type enabled%s",
|
||||
met, VTY_NEWLINE);
|
||||
return CMD_ERR_AMBIGUOUS;
|
||||
}
|
||||
|
||||
/* RFC4444 */
|
||||
if (circuit->area && circuit->area->newmetric == 1 &&
|
||||
met > MAX_WIDE_LINK_METRIC)
|
||||
{
|
||||
vty_out (vty, "Invalid metric %d - should be <0-16777215> "
|
||||
"when wide metric type enabled%s",
|
||||
met, VTY_NEWLINE);
|
||||
return CMD_ERR_AMBIGUOUS;
|
||||
}
|
||||
|
||||
isis_circuit_metric_set (circuit, IS_LEVEL_2, met);
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN (no_isis_metric_l2,
|
||||
no_isis_metric_l2_cmd,
|
||||
"no isis metric level-2",
|
||||
NO_STR
|
||||
"IS-IS commands\n"
|
||||
"Set default metric for circuit\n"
|
||||
"Specify metric for level-2 routing\n")
|
||||
{
|
||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
||||
if (!circuit)
|
||||
return CMD_ERR_NO_MATCH;
|
||||
|
||||
isis_circuit_metric_set (circuit, IS_LEVEL_2, DEFAULT_CIRCUIT_METRIC);
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
ALIAS (no_isis_metric_l2,
|
||||
no_isis_metric_l2_arg_cmd,
|
||||
"no isis metric <0-16777215> level-2",
|
||||
NO_STR
|
||||
"IS-IS commands\n"
|
||||
"Set default metric for circuit\n"
|
||||
"Default metric value\n"
|
||||
"Specify metric for level-2 routing\n")
|
||||
/* end of metrics */
|
||||
|
||||
void
|
||||
isis_vty_init (void)
|
||||
{
|
||||
install_element (INTERFACE_NODE, &ip_router_isis_cmd);
|
||||
install_element (INTERFACE_NODE, &no_ip_router_isis_cmd);
|
||||
|
||||
install_element (INTERFACE_NODE, &isis_passive_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_passive_cmd);
|
||||
|
||||
install_element (INTERFACE_NODE, &isis_circuit_type_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_circuit_type_cmd);
|
||||
|
||||
install_element (INTERFACE_NODE, &isis_network_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_network_cmd);
|
||||
|
||||
install_element (INTERFACE_NODE, &isis_priority_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_priority_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_priority_arg_cmd);
|
||||
install_element (INTERFACE_NODE, &isis_priority_l1_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_priority_l1_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_priority_l1_arg_cmd);
|
||||
install_element (INTERFACE_NODE, &isis_priority_l2_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_priority_l2_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_priority_l2_arg_cmd);
|
||||
|
||||
install_element (INTERFACE_NODE, &isis_metric_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_metric_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_metric_arg_cmd);
|
||||
install_element (INTERFACE_NODE, &isis_metric_l1_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_metric_l1_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_metric_l1_arg_cmd);
|
||||
install_element (INTERFACE_NODE, &isis_metric_l2_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_metric_l2_cmd);
|
||||
install_element (INTERFACE_NODE, &no_isis_metric_l2_arg_cmd);
|
||||
}
|
@ -27,7 +27,11 @@
|
||||
|
||||
#define ISISD_VERSION "0.0.7"
|
||||
|
||||
#include "isisd/isis_constants.h"
|
||||
#include "isisd/isis_common.h"
|
||||
#include "isisd/isis_redist.h"
|
||||
#include "isis_flags.h"
|
||||
#include "dict.h"
|
||||
|
||||
/* uncomment if you are a developer in bug hunt */
|
||||
/* #define EXTREME_DEBUG */
|
||||
@ -139,6 +143,8 @@ struct isis_area *isis_area_lookup (const char *);
|
||||
int isis_area_get (struct vty *vty, const char *area_tag);
|
||||
void print_debug(struct vty *, int, int);
|
||||
|
||||
void isis_vty_init (void);
|
||||
|
||||
/* Master of threads. */
|
||||
extern struct thread_master *master;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user