mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-14 04:26:12 +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_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_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_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 = \
|
noinst_HEADERS = \
|
||||||
|
@ -1250,364 +1250,88 @@ isis_interface_config_write (struct vty *vty)
|
|||||||
return write;
|
return write;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFUN (ip_router_isis,
|
struct isis_circuit *
|
||||||
ip_router_isis_cmd,
|
isis_circuit_create (struct isis_area *area, struct interface *ifp)
|
||||||
"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 *circuit;
|
struct isis_circuit *circuit;
|
||||||
struct interface *ifp;
|
circuit = isis_csm_state_change (ISIS_ENABLE, NULL, area);
|
||||||
struct isis_area *area;
|
assert (circuit->state == C_STATE_CONF || circuit->state == C_STATE_UP);
|
||||||
int rv;
|
isis_circuit_if_bind (circuit, ifp);
|
||||||
|
return circuit;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFUN (no_ip_router_isis,
|
void
|
||||||
no_ip_router_isis_cmd,
|
isis_circuit_af_set (struct isis_circuit *circuit, bool ip_router, bool ipv6_router)
|
||||||
"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")
|
|
||||||
{
|
{
|
||||||
struct interface *ifp;
|
struct isis_area *area = circuit->area;
|
||||||
struct isis_area *area;
|
bool change = circuit->ip_router != ip_router || circuit->ipv6_router != ipv6_router;
|
||||||
struct isis_circuit *circuit;
|
bool was_enabled = circuit->ip_router || circuit->ipv6_router;
|
||||||
|
|
||||||
ifp = (struct interface *) vty->index;
|
area->ip_circuits += ip_router - circuit->ip_router;
|
||||||
if (!ifp)
|
area->ipv6_circuits += ipv6_router - circuit->ipv6_router;
|
||||||
{
|
circuit->ip_router = ip_router;
|
||||||
vty_out (vty, "Invalid interface %s", VTY_NEWLINE);
|
circuit->ipv6_router = ipv6_router;
|
||||||
return CMD_ERR_NO_MATCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
area = isis_area_lookup (argv[0]);
|
if (!change)
|
||||||
if (!area)
|
return;
|
||||||
{
|
|
||||||
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);
|
circuit_update_nlpids (circuit);
|
||||||
if (!circuit)
|
|
||||||
{
|
|
||||||
vty_out (vty, "ISIS is not enabled on circuit %s%s",
|
|
||||||
ifp->name, VTY_NEWLINE);
|
|
||||||
return CMD_ERR_NO_MATCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
circuit->ip_router = 0;
|
if (!ip_router && !ipv6_router)
|
||||||
area->ip_circuits--;
|
|
||||||
if (circuit->ipv6_router == 0)
|
|
||||||
isis_csm_state_change (ISIS_DISABLE, circuit, area);
|
isis_csm_state_change (ISIS_DISABLE, circuit, area);
|
||||||
|
else if (!was_enabled)
|
||||||
|
isis_csm_state_change (ISIS_ENABLE, circuit, area);
|
||||||
else
|
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);
|
lsp_regenerate_schedule(circuit->area, circuit->is_type, 0);
|
||||||
return rv;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFUN (no_ipv6_router_isis,
|
int
|
||||||
no_ipv6_router_isis_cmd,
|
isis_circuit_passive_set (struct isis_circuit *circuit, bool passive)
|
||||||
"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")
|
|
||||||
{
|
{
|
||||||
struct interface *ifp;
|
if (circuit->is_passive == passive)
|
||||||
struct isis_area *area;
|
return 0;
|
||||||
struct isis_circuit *circuit;
|
|
||||||
|
|
||||||
ifp = (struct interface *) vty->index;
|
if (if_is_loopback (circuit->interface) && !passive)
|
||||||
if (!ifp)
|
return -1;
|
||||||
{
|
|
||||||
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 (circuit->state != C_STATE_UP)
|
if (circuit->state != C_STATE_UP)
|
||||||
{
|
{
|
||||||
circuit->is_passive = 1;
|
circuit->is_passive = passive;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
struct isis_area *area = circuit->area;
|
struct isis_area *area = circuit->area;
|
||||||
isis_csm_state_change (ISIS_DISABLE, 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);
|
isis_csm_state_change (ISIS_ENABLE, circuit, area);
|
||||||
}
|
}
|
||||||
|
|
||||||
return CMD_SUCCESS;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFUN (no_isis_passive,
|
void
|
||||||
no_isis_passive_cmd,
|
isis_circuit_is_type_set (struct isis_circuit *circuit, int circ_type)
|
||||||
"no isis passive",
|
|
||||||
NO_STR
|
|
||||||
"IS-IS commands\n"
|
|
||||||
"Configure the passive mode for interface\n")
|
|
||||||
{
|
{
|
||||||
struct interface *ifp;
|
if (circuit->circ_type != circ_type)
|
||||||
struct isis_circuit *circuit;
|
isis_event_circuit_type_change (circuit, circ_type);
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFUN (isis_circuit_type,
|
int
|
||||||
isis_circuit_type_cmd,
|
isis_circuit_metric_set (struct isis_circuit *circuit, int level, int metric)
|
||||||
"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 circuit_type;
|
assert (level == IS_LEVEL_1 || level == IS_LEVEL_2);
|
||||||
struct isis_circuit *circuit = isis_circuit_lookup (vty);
|
if (metric > MAX_WIDE_LINK_METRIC)
|
||||||
if (!circuit)
|
return -1;
|
||||||
return CMD_ERR_NO_MATCH;
|
if (circuit->area && circuit->area->oldmetric
|
||||||
|
&& metric > MAX_NARROW_LINK_METRIC)
|
||||||
|
return -1;
|
||||||
|
|
||||||
circuit_type = string2circuit_t (argv[0]);
|
circuit->te_metric[level - 1] = metric;
|
||||||
if (!circuit_type)
|
circuit->metrics[level - 1].metric_default = metric;
|
||||||
{
|
|
||||||
vty_out (vty, "Unknown circuit-type %s", VTY_NEWLINE);
|
|
||||||
return CMD_ERR_AMBIGUOUS;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (circuit->state == C_STATE_UP &&
|
if (circuit->area)
|
||||||
circuit->area->is_type != IS_LEVEL_1_AND_2 &&
|
lsp_regenerate_schedule (circuit->area, level, 0);
|
||||||
circuit->area->is_type != circuit_type)
|
return 0;
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFUN (isis_passwd_md5,
|
DEFUN (isis_passwd_md5,
|
||||||
@ -1678,387 +1402,6 @@ DEFUN (no_isis_passwd,
|
|||||||
return CMD_SUCCESS;
|
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,
|
DEFUN (isis_hello_interval,
|
||||||
isis_hello_interval_cmd,
|
isis_hello_interval_cmd,
|
||||||
"isis hello-interval <1-600>",
|
"isis hello-interval <1-600>",
|
||||||
@ -2726,86 +2069,43 @@ struct cmd_node interface_node = {
|
|||||||
1,
|
1,
|
||||||
};
|
};
|
||||||
|
|
||||||
DEFUN (isis_network,
|
int
|
||||||
isis_network_cmd,
|
isis_circuit_circ_type_set(struct isis_circuit *circuit, int circ_type)
|
||||||
"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);
|
/* Changing the network type to/of loopback or unknown interfaces
|
||||||
if (!circuit)
|
* is not supported. */
|
||||||
return CMD_ERR_NO_MATCH;
|
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 == circ_type)
|
||||||
if (circuit->circ_type == CIRCUIT_T_P2P)
|
return 0;
|
||||||
return CMD_SUCCESS;
|
|
||||||
|
|
||||||
if (circuit->state != C_STATE_UP)
|
if (circuit->state != C_STATE_UP)
|
||||||
{
|
{
|
||||||
circuit->circ_type = CIRCUIT_T_P2P;
|
circuit->circ_type = circ_type;
|
||||||
circuit->circ_type_config = CIRCUIT_T_P2P;
|
circuit->circ_type_config = circ_type;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
struct isis_area *area = circuit->area;
|
struct isis_area *area = circuit->area;
|
||||||
if (!if_is_broadcast (circuit->interface))
|
if (circ_type == CIRCUIT_T_BROADCAST
|
||||||
{
|
&& !if_is_broadcast(circuit->interface))
|
||||||
vty_out (vty, "isis network point-to-point "
|
return -1;
|
||||||
"is valid only on broadcast interfaces%s",
|
|
||||||
VTY_NEWLINE);
|
|
||||||
return CMD_ERR_AMBIGUOUS;
|
|
||||||
}
|
|
||||||
|
|
||||||
isis_csm_state_change (ISIS_DISABLE, circuit, area);
|
isis_csm_state_change(ISIS_DISABLE, circuit, area);
|
||||||
circuit->circ_type = CIRCUIT_T_P2P;
|
circuit->circ_type = circ_type;
|
||||||
circuit->circ_type_config = CIRCUIT_T_P2P;
|
circuit->circ_type_config = circ_type;
|
||||||
isis_csm_state_change (ISIS_ENABLE, circuit, area);
|
isis_csm_state_change(ISIS_ENABLE, circuit, area);
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -2845,39 +2145,10 @@ isis_circuit_init ()
|
|||||||
install_element (INTERFACE_NODE, &interface_desc_cmd);
|
install_element (INTERFACE_NODE, &interface_desc_cmd);
|
||||||
install_element (INTERFACE_NODE, &no_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_clear_cmd);
|
||||||
install_element (INTERFACE_NODE, &isis_passwd_md5_cmd);
|
install_element (INTERFACE_NODE, &isis_passwd_md5_cmd);
|
||||||
install_element (INTERFACE_NODE, &no_isis_passwd_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, &isis_hello_interval_cmd);
|
||||||
install_element (INTERFACE_NODE, &no_isis_hello_interval_cmd);
|
install_element (INTERFACE_NODE, &no_isis_hello_interval_cmd);
|
||||||
install_element (INTERFACE_NODE, &no_isis_hello_interval_arg_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_cmd);
|
||||||
install_element (INTERFACE_NODE, &no_psnp_interval_l2_arg_cmd);
|
install_element (INTERFACE_NODE, &no_psnp_interval_l2_arg_cmd);
|
||||||
|
|
||||||
install_element (INTERFACE_NODE, &isis_network_cmd);
|
isis_vty_init ();
|
||||||
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
|
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,10 @@
|
|||||||
#define ISIS_CIRCUIT_H
|
#define ISIS_CIRCUIT_H
|
||||||
|
|
||||||
#include "vty.h"
|
#include "vty.h"
|
||||||
|
#include "if.h"
|
||||||
|
|
||||||
|
#include "isis_constants.h"
|
||||||
|
#include "isis_common.h"
|
||||||
|
|
||||||
#define CIRCUIT_MAX 255
|
#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);
|
size_t isis_circuit_pdu_size(struct isis_circuit *circuit);
|
||||||
void isis_circuit_stream(struct isis_circuit *circuit, struct stream **stream);
|
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 */
|
#endif /* _ZEBRA_ISIS_CIRCUIT_H */
|
||||||
|
@ -44,6 +44,7 @@ struct isis_redist
|
|||||||
|
|
||||||
struct isis_area;
|
struct isis_area;
|
||||||
struct prefix;
|
struct prefix;
|
||||||
|
struct vty;
|
||||||
|
|
||||||
struct route_table *get_ext_reach(struct isis_area *area,
|
struct route_table *get_ext_reach(struct isis_area *area,
|
||||||
int family, int level);
|
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"
|
#define ISISD_VERSION "0.0.7"
|
||||||
|
|
||||||
|
#include "isisd/isis_constants.h"
|
||||||
|
#include "isisd/isis_common.h"
|
||||||
#include "isisd/isis_redist.h"
|
#include "isisd/isis_redist.h"
|
||||||
|
#include "isis_flags.h"
|
||||||
|
#include "dict.h"
|
||||||
|
|
||||||
/* uncomment if you are a developer in bug hunt */
|
/* uncomment if you are a developer in bug hunt */
|
||||||
/* #define EXTREME_DEBUG */
|
/* #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);
|
int isis_area_get (struct vty *vty, const char *area_tag);
|
||||||
void print_debug(struct vty *, int, int);
|
void print_debug(struct vty *, int, int);
|
||||||
|
|
||||||
|
void isis_vty_init (void);
|
||||||
|
|
||||||
/* Master of threads. */
|
/* Master of threads. */
|
||||||
extern struct thread_master *master;
|
extern struct thread_master *master;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user