2003-12-23 09:09:43 +01:00
|
|
|
/*
|
|
|
|
* IS-IS Rout(e)ing protocol - isis_circuit.h
|
|
|
|
*
|
|
|
|
* Copyright (C) 2001,2002 Sampo Saaristo
|
|
|
|
* Tampere University of Technology
|
|
|
|
* Institute of Communications Engineering
|
|
|
|
*
|
|
|
|
* 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 <stdlib.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <ctype.h>
|
|
|
|
#include <zebra.h>
|
2004-05-19 13:38:40 +02:00
|
|
|
#ifdef GNU_LINUX
|
2003-12-23 09:09:43 +01:00
|
|
|
#include <net/ethernet.h>
|
2004-05-19 13:38:40 +02:00
|
|
|
#else
|
|
|
|
#include <netinet/if_ether.h>
|
|
|
|
#endif
|
2003-12-23 09:09:43 +01:00
|
|
|
|
|
|
|
#include "log.h"
|
|
|
|
#include "memory.h"
|
|
|
|
#include "if.h"
|
|
|
|
#include "linklist.h"
|
|
|
|
#include "command.h"
|
|
|
|
#include "thread.h"
|
|
|
|
#include "hash.h"
|
|
|
|
#include "prefix.h"
|
|
|
|
#include "stream.h"
|
|
|
|
|
|
|
|
#include "isisd/dict.h"
|
|
|
|
#include "isisd/include-netbsd/iso.h"
|
|
|
|
#include "isisd/isis_constants.h"
|
|
|
|
#include "isisd/isis_common.h"
|
|
|
|
#include "isisd/isis_circuit.h"
|
|
|
|
#include "isisd/isis_tlv.h"
|
|
|
|
#include "isisd/isis_lsp.h"
|
|
|
|
#include "isisd/isis_pdu.h"
|
|
|
|
#include "isisd/isis_network.h"
|
|
|
|
#include "isisd/isis_misc.h"
|
|
|
|
#include "isisd/isis_constants.h"
|
|
|
|
#include "isisd/isis_adjacency.h"
|
|
|
|
#include "isisd/isis_dr.h"
|
|
|
|
#include "isisd/isis_flags.h"
|
|
|
|
#include "isisd/isisd.h"
|
|
|
|
#include "isisd/isis_csm.h"
|
|
|
|
#include "isisd/isis_events.h"
|
|
|
|
|
|
|
|
extern struct thread_master *master;
|
|
|
|
extern struct isis *isis;
|
|
|
|
|
|
|
|
struct isis_circuit *
|
|
|
|
isis_circuit_new ()
|
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
circuit = XMALLOC (MTYPE_ISIS_CIRCUIT, sizeof (struct isis_circuit));
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit)
|
|
|
|
{
|
|
|
|
memset (circuit, 0, sizeof (struct isis_circuit));
|
|
|
|
/* set default metrics for circuit */
|
|
|
|
for (i = 0; i < 2; i++)
|
|
|
|
{
|
|
|
|
circuit->metrics[i].metric_default = DEFAULT_CIRCUIT_METRICS;
|
|
|
|
circuit->metrics[i].metric_expense = METRICS_UNSUPPORTED;
|
|
|
|
circuit->metrics[i].metric_error = METRICS_UNSUPPORTED;
|
|
|
|
circuit->metrics[i].metric_delay = METRICS_UNSUPPORTED;
|
2005-09-26 19:05:55 +02:00
|
|
|
circuit->te_metric[i] = DEFAULT_CIRCUIT_METRICS;
|
2004-09-10 22:48:21 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
zlog_err ("Can't malloc isis circuit");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
return circuit;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
isis_circuit_configure (struct isis_circuit *circuit, struct isis_area *area)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
circuit->area = area;
|
|
|
|
/*
|
|
|
|
* The level for the circuit is same as for the area, unless configured
|
|
|
|
* otherwise.
|
|
|
|
*/
|
|
|
|
circuit->circuit_is_type = area->is_type;
|
|
|
|
/*
|
|
|
|
* Default values
|
|
|
|
*/
|
2004-09-10 22:48:21 +02:00
|
|
|
for (i = 0; i < 2; i++)
|
|
|
|
{
|
|
|
|
circuit->hello_interval[i] = HELLO_INTERVAL;
|
|
|
|
circuit->hello_multiplier[i] = HELLO_MULTIPLIER;
|
|
|
|
circuit->csnp_interval[i] = CSNP_INTERVAL;
|
|
|
|
circuit->psnp_interval[i] = PSNP_INTERVAL;
|
|
|
|
circuit->u.bc.priority[i] = DEFAULT_PRIORITY;
|
|
|
|
}
|
|
|
|
if (circuit->circ_type == CIRCUIT_T_BROADCAST)
|
|
|
|
{
|
|
|
|
circuit->u.bc.adjdb[0] = list_new ();
|
|
|
|
circuit->u.bc.adjdb[1] = list_new ();
|
|
|
|
circuit->u.bc.pad_hellos = 1;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit->lsp_interval = LSP_INTERVAL;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Add the circuit into area
|
|
|
|
*/
|
|
|
|
listnode_add (area->circuit_list, circuit);
|
|
|
|
|
|
|
|
circuit->idx = flags_get_index (&area->flags);
|
|
|
|
circuit->lsp_queue = list_new ();
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
void
|
2003-12-23 09:09:43 +01:00
|
|
|
isis_circuit_deconfigure (struct isis_circuit *circuit,
|
2004-09-10 22:48:21 +02:00
|
|
|
struct isis_area *area)
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
/* Remove circuit from area */
|
|
|
|
listnode_delete (area->circuit_list, circuit);
|
|
|
|
/* Free the index of SRM and SSN flags */
|
|
|
|
flags_free_index (&area->flags, circuit->idx);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct isis_circuit *
|
|
|
|
circuit_lookup_by_ifp (struct interface *ifp, struct list *list)
|
|
|
|
{
|
|
|
|
struct isis_circuit *circuit = NULL;
|
|
|
|
struct listnode *node;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
if (!list)
|
|
|
|
return NULL;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS_RO (list, node, circuit))
|
|
|
|
if (circuit->interface == ifp)
|
|
|
|
return circuit;
|
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct isis_circuit *
|
|
|
|
circuit_scan_by_ifp (struct interface *ifp)
|
|
|
|
{
|
|
|
|
struct isis_area *area;
|
|
|
|
struct listnode *node;
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
|
|
|
|
if (!isis->area_list)
|
|
|
|
return NULL;
|
|
|
|
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
|
2004-09-10 22:48:21 +02:00
|
|
|
{
|
|
|
|
circuit = circuit_lookup_by_ifp (ifp, area->circuit_list);
|
|
|
|
if (circuit)
|
|
|
|
return circuit;
|
|
|
|
}
|
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
return circuit_lookup_by_ifp (ifp, isis->init_circ_list);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
isis_circuit_del (struct isis_circuit *circuit)
|
|
|
|
{
|
|
|
|
|
|
|
|
if (!circuit)
|
|
|
|
return;
|
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit->circ_type == CIRCUIT_T_BROADCAST)
|
|
|
|
{
|
|
|
|
/* destroy adjacency databases */
|
2004-12-29 20:34:22 +01:00
|
|
|
if (circuit->u.bc.adjdb[0])
|
|
|
|
list_delete (circuit->u.bc.adjdb[0]);
|
|
|
|
if (circuit->u.bc.adjdb[1])
|
|
|
|
list_delete (circuit->u.bc.adjdb[1]);
|
2004-09-10 22:48:21 +02:00
|
|
|
/* destroy neighbour lists */
|
|
|
|
if (circuit->u.bc.lan_neighs[0])
|
|
|
|
list_delete (circuit->u.bc.lan_neighs[0]);
|
|
|
|
if (circuit->u.bc.lan_neighs[1])
|
|
|
|
list_delete (circuit->u.bc.lan_neighs[1]);
|
|
|
|
/* destroy addresses */
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
if (circuit->ip_addrs)
|
|
|
|
list_delete (circuit->ip_addrs);
|
|
|
|
#ifdef HAVE_IPV6
|
|
|
|
if (circuit->ipv6_link)
|
|
|
|
list_delete (circuit->ipv6_link);
|
|
|
|
if (circuit->ipv6_non_link)
|
|
|
|
list_delete (circuit->ipv6_non_link);
|
|
|
|
#endif /* HAVE_IPV6 */
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
/* and lastly the circuit itself */
|
|
|
|
XFREE (MTYPE_ISIS_CIRCUIT, circuit);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2004-09-14 15:54:30 +02:00
|
|
|
isis_circuit_add_addr (struct isis_circuit *circuit,
|
|
|
|
struct connected *connected)
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
|
|
|
struct prefix_ipv4 *ipv4;
|
2004-09-10 22:48:21 +02:00
|
|
|
u_char buf[BUFSIZ];
|
2003-12-23 09:09:43 +01:00
|
|
|
#ifdef HAVE_IPV6
|
|
|
|
struct prefix_ipv6 *ipv6;
|
|
|
|
#endif /* HAVE_IPV6 */
|
2004-09-14 15:54:30 +02:00
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
if (!circuit->ip_addrs)
|
2004-09-14 15:54:30 +02:00
|
|
|
circuit->ip_addrs = list_new ();
|
2003-12-23 09:09:43 +01:00
|
|
|
#ifdef HAVE_IPV6
|
2004-09-10 22:48:21 +02:00
|
|
|
if (!circuit->ipv6_link)
|
2004-09-14 15:54:30 +02:00
|
|
|
circuit->ipv6_link = list_new ();
|
2004-09-10 22:48:21 +02:00
|
|
|
if (!circuit->ipv6_non_link)
|
2004-09-14 15:54:30 +02:00
|
|
|
circuit->ipv6_non_link = list_new ();
|
2003-12-23 09:09:43 +01:00
|
|
|
#endif /* HAVE_IPV6 */
|
|
|
|
|
|
|
|
memset (&buf, 0, BUFSIZ);
|
2004-09-14 15:54:30 +02:00
|
|
|
if (connected->address->family == AF_INET)
|
2004-09-10 22:48:21 +02:00
|
|
|
{
|
|
|
|
ipv4 = prefix_ipv4_new ();
|
2004-09-14 15:54:30 +02:00
|
|
|
ipv4->prefixlen = connected->address->prefixlen;
|
|
|
|
ipv4->prefix = connected->address->u.prefix4;
|
2004-09-10 22:48:21 +02:00
|
|
|
listnode_add (circuit->ip_addrs, ipv4);
|
2004-09-26 21:53:47 +02:00
|
|
|
if (circuit->area)
|
|
|
|
lsp_regenerate_schedule (circuit->area);
|
2004-09-14 15:54:30 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
#ifdef EXTREME_DEBUG
|
2004-09-14 15:54:30 +02:00
|
|
|
prefix2str (connected->address, buf, BUFSIZ);
|
2004-12-24 01:14:50 +01:00
|
|
|
zlog_debug ("Added IP address %s to circuit %d", buf,
|
2004-09-10 22:48:21 +02:00
|
|
|
circuit->circuit_id);
|
|
|
|
#endif /* EXTREME_DEBUG */
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
#ifdef HAVE_IPV6
|
2004-09-14 15:54:30 +02:00
|
|
|
if (connected->address->family == AF_INET6)
|
2004-09-10 22:48:21 +02:00
|
|
|
{
|
|
|
|
ipv6 = prefix_ipv6_new ();
|
2004-09-14 15:54:30 +02:00
|
|
|
ipv6->prefixlen = connected->address->prefixlen;
|
|
|
|
ipv6->prefix = connected->address->u.prefix6;
|
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
if (IN6_IS_ADDR_LINKLOCAL (&ipv6->prefix))
|
2004-09-14 15:54:30 +02:00
|
|
|
listnode_add (circuit->ipv6_link, ipv6);
|
2004-09-10 22:48:21 +02:00
|
|
|
else
|
2004-09-14 15:54:30 +02:00
|
|
|
listnode_add (circuit->ipv6_non_link, ipv6);
|
2004-09-26 21:53:47 +02:00
|
|
|
if (circuit->area)
|
|
|
|
lsp_regenerate_schedule (circuit->area);
|
2004-09-14 15:54:30 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
#ifdef EXTREME_DEBUG
|
2004-09-14 15:54:30 +02:00
|
|
|
prefix2str (connected->address, buf, BUFSIZ);
|
2004-12-24 01:14:50 +01:00
|
|
|
zlog_debug ("Added IPv6 address %s to circuit %d", buf,
|
2004-09-10 22:48:21 +02:00
|
|
|
circuit->circuit_id);
|
|
|
|
#endif /* EXTREME_DEBUG */
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
#endif /* HAVE_IPV6 */
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
isis_circuit_del_addr (struct isis_circuit *circuit,
|
2004-09-10 22:48:21 +02:00
|
|
|
struct connected *connected)
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
2004-09-14 15:54:30 +02:00
|
|
|
struct prefix_ipv4 *ipv4, *ip = NULL;
|
|
|
|
struct listnode *node;
|
|
|
|
int found = 0;
|
|
|
|
u_char buf[BUFSIZ];
|
|
|
|
#ifdef HAVE_IPV6
|
|
|
|
struct prefix_ipv6 *ipv6, *ip6 = NULL;
|
|
|
|
#endif /* HAVE_IPV6 */
|
|
|
|
|
|
|
|
memset (&buf, 0, BUFSIZ);
|
|
|
|
if (connected->address->family == AF_INET)
|
|
|
|
{
|
|
|
|
ipv4 = prefix_ipv4_new ();
|
|
|
|
ipv4->prefixlen = connected->address->prefixlen;
|
|
|
|
ipv4->prefix = connected->address->u.prefix4;
|
2003-12-23 09:09:43 +01:00
|
|
|
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS_RO (circuit->ip_addrs, node, ip))
|
|
|
|
if (prefix_same ((struct prefix *) ip, (struct prefix *) &ipv4))
|
|
|
|
break;
|
2004-09-14 15:54:30 +02:00
|
|
|
|
|
|
|
if (ip)
|
|
|
|
{
|
|
|
|
listnode_delete (circuit->ip_addrs, ip);
|
2004-09-26 21:53:47 +02:00
|
|
|
if (circuit->area)
|
|
|
|
lsp_regenerate_schedule (circuit->area);
|
2004-09-14 15:54:30 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2004-09-26 18:24:14 +02:00
|
|
|
prefix2str (connected->address, (char *)buf, BUFSIZ);
|
2004-09-14 15:54:30 +02:00
|
|
|
zlog_warn("Nonexitant ip address %s removal attempt from circuit \
|
|
|
|
%d", buf, circuit->circuit_id);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#ifdef HAVE_IPV6
|
|
|
|
if (connected->address->family == AF_INET6)
|
|
|
|
{
|
|
|
|
ipv6 = prefix_ipv6_new ();
|
|
|
|
ipv6->prefixlen = connected->address->prefixlen;
|
|
|
|
ipv6->prefix = connected->address->u.prefix6;
|
|
|
|
|
|
|
|
if (IN6_IS_ADDR_LINKLOCAL (&ipv6->prefix))
|
|
|
|
{
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS_RO (circuit->ipv6_link, node, ip6))
|
2004-09-14 15:54:30 +02:00
|
|
|
{
|
|
|
|
if (prefix_same ((struct prefix *) ip6, (struct prefix *) ipv6))
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (ip6)
|
|
|
|
{
|
|
|
|
listnode_delete (circuit->ipv6_link, ip6);
|
|
|
|
found = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS_RO (circuit->ipv6_non_link, node, ip6))
|
2004-09-14 15:54:30 +02:00
|
|
|
{
|
|
|
|
if (prefix_same ((struct prefix *) ip6, (struct prefix *) ipv6))
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (ip6)
|
|
|
|
{
|
|
|
|
listnode_delete (circuit->ipv6_non_link, ip6);
|
|
|
|
found = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!found)
|
|
|
|
{
|
2004-09-26 18:24:14 +02:00
|
|
|
prefix2str (connected->address, (char *)buf, BUFSIZ);
|
2004-09-14 15:54:30 +02:00
|
|
|
zlog_warn("Nonexitant ip address %s removal attempt from \
|
|
|
|
circuit %d", buf, circuit->circuit_id);
|
|
|
|
}
|
|
|
|
else
|
2004-09-26 21:53:47 +02:00
|
|
|
if (circuit->area)
|
|
|
|
lsp_regenerate_schedule (circuit->area);
|
2004-09-14 15:54:30 +02:00
|
|
|
}
|
|
|
|
#endif /* HAVE_IPV6 */
|
|
|
|
return;
|
2003-12-23 09:09:43 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
isis_circuit_if_add (struct isis_circuit *circuit, struct interface *ifp)
|
|
|
|
{
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2003-12-23 09:09:43 +01:00
|
|
|
struct connected *conn;
|
|
|
|
|
|
|
|
circuit->interface = ifp;
|
|
|
|
ifp->info = circuit;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
|
|
|
circuit->circuit_id = ifp->ifindex % 255; /* FIXME: Why not ? */
|
2003-12-23 09:09:43 +01:00
|
|
|
|
|
|
|
/* isis_circuit_update_addrs (circuit, ifp); */
|
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
if (if_is_broadcast (ifp))
|
|
|
|
{
|
|
|
|
circuit->circ_type = CIRCUIT_T_BROADCAST;
|
|
|
|
/*
|
|
|
|
* Get the Hardware Address
|
|
|
|
*/
|
2003-12-23 09:09:43 +01:00
|
|
|
#ifdef HAVE_SOCKADDR_DL
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit->interface->sdl.sdl_alen != ETHER_ADDR_LEN)
|
|
|
|
zlog_warn ("unsupported link layer");
|
|
|
|
else
|
|
|
|
memcpy (circuit->u.bc.snpa, LLADDR (&circuit->interface->sdl),
|
|
|
|
ETH_ALEN);
|
2003-12-23 09:09:43 +01:00
|
|
|
#else
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit->interface->hw_addr_len != ETH_ALEN)
|
|
|
|
{
|
|
|
|
zlog_warn ("unsupported link layer");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
memcpy (circuit->u.bc.snpa, circuit->interface->hw_addr, ETH_ALEN);
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
#ifdef EXTREME_DEGUG
|
2004-12-24 01:14:50 +01:00
|
|
|
zlog_debug ("isis_circuit_if_add: if_id %d, isomtu %d snpa %s",
|
2004-09-10 22:48:21 +02:00
|
|
|
circuit->interface->ifindex, ISO_MTU (circuit),
|
|
|
|
snpa_print (circuit->u.bc.snpa));
|
2003-12-23 09:09:43 +01:00
|
|
|
|
|
|
|
#endif /* EXTREME_DEBUG */
|
2004-09-10 22:48:21 +02:00
|
|
|
#endif /* HAVE_SOCKADDR_DL */
|
|
|
|
}
|
|
|
|
else if (if_is_pointopoint (ifp))
|
|
|
|
{
|
|
|
|
circuit->circ_type = CIRCUIT_T_P2P;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2005-09-04 23:36:36 +02:00
|
|
|
/* It's normal in case of loopback etc. */
|
|
|
|
if (isis->debugs & DEBUG_EVENTS)
|
|
|
|
zlog_debug ("isis_circuit_if_add: unsupported media");
|
2004-09-10 22:48:21 +02:00
|
|
|
}
|
|
|
|
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (ifp->connected, node, nnode, conn))
|
|
|
|
isis_circuit_add_addr (circuit, conn);
|
2003-12-23 09:09:43 +01:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2004-09-10 22:48:21 +02:00
|
|
|
isis_circuit_update_params (struct isis_circuit *circuit,
|
|
|
|
struct interface *ifp)
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
2004-12-29 21:06:41 +01:00
|
|
|
assert (circuit);
|
2004-09-10 22:48:21 +02:00
|
|
|
|
|
|
|
if (circuit->circuit_id != ifp->ifindex)
|
|
|
|
{
|
|
|
|
zlog_warn ("changing circuit_id %d->%d", circuit->circuit_id,
|
|
|
|
ifp->ifindex);
|
|
|
|
circuit->circuit_id = ifp->ifindex % 255;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
|
|
|
|
/* FIXME: Why is this needed? shouldn't we compare to the area's mtu */
|
|
|
|
/* Ofer, this was here in case someone changes the mtu (e.g. with ifconfig)
|
|
|
|
The areas MTU is the minimum of mtu's of circuits in the area
|
|
|
|
now we can't catch the change
|
|
|
|
if (circuit->mtu != ifp->mtu) {
|
|
|
|
zlog_warn ("changing circuit mtu %d->%d", circuit->mtu,
|
|
|
|
ifp->mtu);
|
|
|
|
circuit->mtu = ifp->mtu;
|
|
|
|
}
|
2004-09-10 22:48:21 +02:00
|
|
|
*/
|
2003-12-23 09:09:43 +01:00
|
|
|
/*
|
|
|
|
* Get the Hardware Address
|
|
|
|
*/
|
|
|
|
#ifdef HAVE_SOCKADDR_DL
|
|
|
|
if (circuit->interface->sdl.sdl_alen != ETHER_ADDR_LEN)
|
|
|
|
zlog_warn ("unsupported link layer");
|
2004-09-10 22:48:21 +02:00
|
|
|
else
|
|
|
|
memcpy (circuit->u.bc.snpa, LLADDR (&circuit->interface->sdl), ETH_ALEN);
|
|
|
|
#else
|
|
|
|
if (circuit->interface->hw_addr_len != ETH_ALEN)
|
|
|
|
{
|
|
|
|
zlog_warn ("unsupported link layer");
|
2003-12-23 09:09:43 +01:00
|
|
|
}
|
2004-09-10 22:48:21 +02:00
|
|
|
else
|
|
|
|
{
|
|
|
|
if (memcmp (circuit->u.bc.snpa, circuit->interface->hw_addr, ETH_ALEN))
|
|
|
|
{
|
|
|
|
zlog_warn ("changing circuit snpa %s->%s",
|
|
|
|
snpa_print (circuit->u.bc.snpa),
|
|
|
|
snpa_print (circuit->interface->hw_addr));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
2003-12-23 09:09:43 +01:00
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
if (if_is_broadcast (ifp))
|
|
|
|
{
|
|
|
|
circuit->circ_type = CIRCUIT_T_BROADCAST;
|
|
|
|
}
|
|
|
|
else if (if_is_pointopoint (ifp))
|
|
|
|
{
|
|
|
|
circuit->circ_type = CIRCUIT_T_P2P;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
zlog_warn ("isis_circuit_update_params: unsupported media");
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2004-09-10 22:48:21 +02:00
|
|
|
isis_circuit_if_del (struct isis_circuit *circuit)
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
|
|
|
circuit->interface->info = NULL;
|
|
|
|
circuit->interface = NULL;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
isis_circuit_up (struct isis_circuit *circuit)
|
|
|
|
{
|
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit->circ_type == CIRCUIT_T_BROADCAST)
|
|
|
|
{
|
|
|
|
if (circuit->area->min_bcast_mtu == 0 ||
|
|
|
|
ISO_MTU (circuit) < circuit->area->min_bcast_mtu)
|
|
|
|
circuit->area->min_bcast_mtu = ISO_MTU (circuit);
|
|
|
|
/*
|
|
|
|
* ISO 10589 - 8.4.1 Enabling of broadcast circuits
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* initilizing the hello sending threads
|
|
|
|
* for a broadcast IF
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* 8.4.1 a) commence sending of IIH PDUs */
|
|
|
|
|
|
|
|
if (circuit->circuit_is_type & IS_LEVEL_1)
|
|
|
|
{
|
|
|
|
thread_add_event (master, send_lan_l1_hello, circuit, 0);
|
|
|
|
circuit->u.bc.lan_neighs[0] = list_new ();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (circuit->circuit_is_type & IS_LEVEL_2)
|
|
|
|
{
|
|
|
|
thread_add_event (master, send_lan_l2_hello, circuit, 0);
|
|
|
|
circuit->u.bc.lan_neighs[1] = list_new ();
|
|
|
|
}
|
|
|
|
|
|
|
|
/* 8.4.1 b) FIXME: solicit ES - 8.4.6 */
|
|
|
|
/* 8.4.1 c) FIXME: listen for ESH PDUs */
|
|
|
|
|
|
|
|
/* 8.4.1 d) */
|
|
|
|
/* dr election will commence in... */
|
|
|
|
if (circuit->circuit_is_type & IS_LEVEL_1)
|
|
|
|
THREAD_TIMER_ON (master, circuit->u.bc.t_run_dr[0], isis_run_dr_l1,
|
2004-09-17 09:59:57 +02:00
|
|
|
circuit, 2 * circuit->hello_interval[0]);
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit->circuit_is_type & IS_LEVEL_2)
|
|
|
|
THREAD_TIMER_ON (master, circuit->u.bc.t_run_dr[1], isis_run_dr_l2,
|
2004-09-17 09:59:57 +02:00
|
|
|
circuit, 2 * circuit->hello_interval[1]);
|
2004-09-10 22:48:21 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* initializing the hello send threads
|
|
|
|
* for a ptp IF
|
|
|
|
*/
|
|
|
|
thread_add_event (master, send_p2p_hello, circuit, 0);
|
|
|
|
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
|
|
|
|
/* initializing PSNP timers */
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit->circuit_is_type & IS_LEVEL_1)
|
|
|
|
{
|
|
|
|
THREAD_TIMER_ON (master, circuit->t_send_psnp[0], send_l1_psnp, circuit,
|
|
|
|
isis_jitter (circuit->psnp_interval[0], PSNP_JITTER));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (circuit->circuit_is_type & IS_LEVEL_2)
|
|
|
|
{
|
|
|
|
THREAD_TIMER_ON (master, circuit->t_send_psnp[1], send_l2_psnp, circuit,
|
|
|
|
isis_jitter (circuit->psnp_interval[1], PSNP_JITTER));
|
|
|
|
}
|
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
/* initialize the circuit streams */
|
|
|
|
if (circuit->rcv_stream == NULL)
|
2004-09-10 22:48:21 +02:00
|
|
|
circuit->rcv_stream = stream_new (ISO_MTU (circuit));
|
2003-12-23 09:09:43 +01:00
|
|
|
|
|
|
|
if (circuit->snd_stream == NULL)
|
2004-09-10 22:48:21 +02:00
|
|
|
circuit->snd_stream = stream_new (ISO_MTU (circuit));
|
2003-12-23 09:09:43 +01:00
|
|
|
|
|
|
|
/* unified init for circuits */
|
|
|
|
isis_sock_init (circuit);
|
|
|
|
|
|
|
|
#ifdef GNU_LINUX
|
2004-09-10 22:48:21 +02:00
|
|
|
THREAD_READ_ON (master, circuit->t_read, isis_receive, circuit,
|
|
|
|
circuit->fd);
|
2003-12-23 09:09:43 +01:00
|
|
|
#else
|
2004-09-10 22:48:21 +02:00
|
|
|
THREAD_TIMER_ON (master, circuit->t_read, isis_receive, circuit,
|
|
|
|
circuit->fd);
|
2003-12-23 09:09:43 +01:00
|
|
|
#endif
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
isis_circuit_down (struct isis_circuit *circuit)
|
|
|
|
{
|
2004-09-10 22:48:21 +02:00
|
|
|
/* Cancel all active threads -- FIXME: wrong place */
|
2004-02-11 21:26:31 +01:00
|
|
|
/* HT: Read thread if GNU_LINUX, TIMER thread otherwise. */
|
2004-09-10 22:48:21 +02:00
|
|
|
THREAD_OFF (circuit->t_read);
|
|
|
|
if (circuit->circ_type == CIRCUIT_T_BROADCAST)
|
|
|
|
{
|
|
|
|
THREAD_TIMER_OFF (circuit->u.bc.t_send_lan_hello[0]);
|
|
|
|
THREAD_TIMER_OFF (circuit->u.bc.t_send_lan_hello[1]);
|
2004-09-14 15:54:30 +02:00
|
|
|
THREAD_TIMER_OFF (circuit->u.bc.t_run_dr[0]);
|
|
|
|
THREAD_TIMER_OFF (circuit->u.bc.t_run_dr[1]);
|
2004-09-10 22:48:21 +02:00
|
|
|
}
|
|
|
|
else if (circuit->circ_type == CIRCUIT_T_P2P)
|
|
|
|
{
|
|
|
|
THREAD_TIMER_OFF (circuit->u.p2p.t_send_p2p_hello);
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
/* close the socket */
|
|
|
|
close (circuit->fd);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
circuit_update_nlpids (struct isis_circuit *circuit)
|
|
|
|
{
|
|
|
|
circuit->nlpids.count = 0;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
|
|
|
if (circuit->ip_router)
|
|
|
|
{
|
|
|
|
circuit->nlpids.nlpids[0] = NLPID_IP;
|
|
|
|
circuit->nlpids.count++;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
#ifdef HAVE_IPV6
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit->ipv6_router)
|
|
|
|
{
|
|
|
|
circuit->nlpids.nlpids[circuit->nlpids.count] = NLPID_IPV6;
|
|
|
|
circuit->nlpids.count++;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
#endif /* HAVE_IPV6 */
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
2004-09-10 22:48:21 +02:00
|
|
|
isis_interface_config_write (struct vty *vty)
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
|
|
|
|
|
|
|
int write = 0;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
|
|
|
struct listnode *node2, *nnode2;
|
2003-12-23 09:09:43 +01:00
|
|
|
struct interface *ifp;
|
|
|
|
struct isis_area *area;
|
|
|
|
struct isis_circuit *c;
|
|
|
|
int i;
|
|
|
|
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (iflist, node, nnode, ifp))
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
|
|
|
/* IF name */
|
2004-09-10 22:48:21 +02:00
|
|
|
vty_out (vty, "interface %s%s", ifp->name, VTY_NEWLINE);
|
2003-12-23 09:09:43 +01:00
|
|
|
write++;
|
|
|
|
/* IF desc */
|
2004-09-10 22:48:21 +02:00
|
|
|
if (ifp->desc)
|
|
|
|
{
|
|
|
|
vty_out (vty, " description %s%s", ifp->desc, VTY_NEWLINE);
|
|
|
|
write++;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
/* ISIS Circuit */
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (isis->area_list, node2, nnode2, area))
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
|
|
|
c = circuit_lookup_by_ifp (ifp, area->circuit_list);
|
2004-09-10 22:48:21 +02:00
|
|
|
if (c)
|
|
|
|
{
|
|
|
|
if (c->ip_router)
|
|
|
|
{
|
|
|
|
vty_out (vty, " ip router isis %s%s", area->area_tag,
|
|
|
|
VTY_NEWLINE);
|
|
|
|
write++;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
#ifdef HAVE_IPV6
|
2004-09-10 22:48:21 +02:00
|
|
|
if (c->ipv6_router)
|
|
|
|
{
|
|
|
|
vty_out (vty, " ipv6 router isis %s%s", area->area_tag,
|
|
|
|
VTY_NEWLINE);
|
|
|
|
write++;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
#endif /* HAVE_IPV6 */
|
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
/* ISIS - circuit type */
|
|
|
|
if (c->circuit_is_type == IS_LEVEL_1)
|
|
|
|
{
|
|
|
|
vty_out (vty, " isis circuit-type level-1%s", VTY_NEWLINE);
|
|
|
|
write++;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (c->circuit_is_type == IS_LEVEL_2)
|
|
|
|
{
|
|
|
|
vty_out (vty, " isis circuit-type level-2-only%s",
|
|
|
|
VTY_NEWLINE);
|
|
|
|
write++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ISIS - CSNP interval - FIXME: compare to cisco */
|
|
|
|
if (c->csnp_interval[0] == c->csnp_interval[1])
|
|
|
|
{
|
|
|
|
if (c->csnp_interval[0] != CSNP_INTERVAL)
|
|
|
|
{
|
|
|
|
vty_out (vty, " isis csnp-interval %d%s",
|
|
|
|
c->csnp_interval[0], VTY_NEWLINE);
|
|
|
|
write++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
for (i = 0; i < 2; i++)
|
|
|
|
{
|
|
|
|
if (c->csnp_interval[1] != CSNP_INTERVAL)
|
|
|
|
{
|
|
|
|
vty_out (vty, " isis csnp-interval %d level-%d%s",
|
|
|
|
c->csnp_interval[1], i + 1, VTY_NEWLINE);
|
|
|
|
write++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ISIS - Hello padding - Defaults to true so only display if false */
|
|
|
|
if (c->circ_type == CIRCUIT_T_BROADCAST && !c->u.bc.pad_hellos)
|
|
|
|
{
|
|
|
|
vty_out (vty, " no isis hello padding%s", VTY_NEWLINE);
|
|
|
|
write++;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ISIS - Hello interval - FIXME: compare to cisco */
|
|
|
|
if (c->hello_interval[0] == c->hello_interval[1])
|
|
|
|
{
|
|
|
|
if (c->hello_interval[0] != HELLO_INTERVAL)
|
|
|
|
{
|
|
|
|
vty_out (vty, " isis hello-interval %d%s",
|
|
|
|
c->hello_interval[0], VTY_NEWLINE);
|
|
|
|
write++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
for (i = 0; i < 2; i++)
|
|
|
|
{
|
|
|
|
if (c->hello_interval[i] != HELLO_INTERVAL)
|
|
|
|
{
|
|
|
|
if (c->hello_interval[i] == HELLO_MINIMAL)
|
|
|
|
{
|
|
|
|
vty_out (vty,
|
|
|
|
" isis hello-interval minimal level-%d%s",
|
|
|
|
i + 1, VTY_NEWLINE);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
vty_out (vty, " isis hello-interval %d level-%d%s",
|
|
|
|
c->hello_interval[i], i + 1, VTY_NEWLINE);
|
|
|
|
}
|
|
|
|
write++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ISIS - Hello Multiplier */
|
|
|
|
if (c->hello_multiplier[0] == c->hello_multiplier[1])
|
|
|
|
{
|
|
|
|
if (c->hello_multiplier[0] != HELLO_MULTIPLIER)
|
|
|
|
{
|
|
|
|
vty_out (vty, " isis hello-multiplier %d%s",
|
|
|
|
c->hello_multiplier[0], VTY_NEWLINE);
|
|
|
|
write++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
for (i = 0; i < 2; i++)
|
|
|
|
{
|
|
|
|
if (c->hello_multiplier[i] != HELLO_MULTIPLIER)
|
|
|
|
{
|
|
|
|
vty_out (vty, " isis hello-multiplier %d level-%d%s",
|
|
|
|
c->hello_multiplier[i], i + 1, VTY_NEWLINE);
|
|
|
|
write++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* ISIS - Priority */
|
|
|
|
if (c->circ_type == CIRCUIT_T_BROADCAST)
|
|
|
|
{
|
|
|
|
if (c->u.bc.priority[0] == c->u.bc.priority[1])
|
|
|
|
{
|
|
|
|
if (c->u.bc.priority[0] != DEFAULT_PRIORITY)
|
|
|
|
{
|
|
|
|
vty_out (vty, " isis priority %d%s",
|
|
|
|
c->u.bc.priority[0], VTY_NEWLINE);
|
|
|
|
write++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
for (i = 0; i < 2; i++)
|
|
|
|
{
|
|
|
|
if (c->u.bc.priority[i] != DEFAULT_PRIORITY)
|
|
|
|
{
|
|
|
|
vty_out (vty, " isis priority %d level-%d%s",
|
|
|
|
c->u.bc.priority[i], i + 1, VTY_NEWLINE);
|
|
|
|
write++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* ISIS - Metric */
|
2005-09-26 19:05:55 +02:00
|
|
|
if (c->te_metric[0] == c->te_metric[1])
|
2004-09-10 22:48:21 +02:00
|
|
|
{
|
2005-09-26 19:05:55 +02:00
|
|
|
if (c->te_metric[0] != DEFAULT_CIRCUIT_METRICS)
|
2004-09-10 22:48:21 +02:00
|
|
|
{
|
2005-09-26 19:05:55 +02:00
|
|
|
vty_out (vty, " isis metric %d%s", c->te_metric[0],
|
|
|
|
VTY_NEWLINE);
|
2004-09-10 22:48:21 +02:00
|
|
|
write++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
for (i = 0; i < 2; i++)
|
|
|
|
{
|
2005-09-26 19:05:55 +02:00
|
|
|
if (c->te_metric[i] != DEFAULT_CIRCUIT_METRICS)
|
2004-09-10 22:48:21 +02:00
|
|
|
{
|
|
|
|
vty_out (vty, " isis metric %d level-%d%s",
|
2005-09-26 19:05:55 +02:00
|
|
|
c->te_metric[i], i + 1, VTY_NEWLINE);
|
2004-09-10 22:48:21 +02:00
|
|
|
write++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
}
|
2004-09-10 22:48:21 +02:00
|
|
|
vty_out (vty, "!%s", VTY_NEWLINE);
|
2003-12-23 09:09:43 +01:00
|
|
|
}
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
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"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Routing process tag\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
|
|
|
struct isis_circuit *c;
|
|
|
|
struct interface *ifp;
|
|
|
|
struct isis_area *area;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
|
|
|
ifp = (struct interface *) vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (ifp);
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
area = isis_area_lookup (argv[0]);
|
|
|
|
|
|
|
|
/* Prevent more than one circuit per interface */
|
|
|
|
if (area)
|
|
|
|
c = circuit_lookup_by_ifp (ifp, area->circuit_list);
|
2004-09-10 22:48:21 +02:00
|
|
|
else
|
|
|
|
c = NULL;
|
|
|
|
if (c && (ifp->info != NULL))
|
|
|
|
{
|
2003-12-23 09:09:43 +01:00
|
|
|
#ifdef HAVE_IPV6
|
2004-09-10 22:48:21 +02:00
|
|
|
if (c->ipv6_router == 0)
|
|
|
|
{
|
2003-12-23 09:09:43 +01:00
|
|
|
#endif /* HAVE_IPV6 */
|
2005-09-04 23:36:36 +02:00
|
|
|
/* FIXME: Find the way to warn only vty users. */
|
|
|
|
/* vty_out (vty, "ISIS circuit is already defined%s", VTY_NEWLINE); */
|
2004-09-10 22:48:21 +02:00
|
|
|
return CMD_WARNING;
|
2003-12-23 09:09:43 +01:00
|
|
|
#ifdef HAVE_IPV6
|
2004-09-10 22:48:21 +02:00
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
#endif /* HAVE_IPV6 */
|
2004-09-10 22:48:21 +02:00
|
|
|
}
|
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
/* this is here for ciscopability */
|
2004-09-10 22:48:21 +02:00
|
|
|
if (!area)
|
|
|
|
{
|
2005-09-04 23:36:36 +02:00
|
|
|
/* FIXME: Find the way to warn only vty users. */
|
|
|
|
/* vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE); */
|
2004-09-10 22:48:21 +02:00
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
if (!c)
|
|
|
|
{
|
|
|
|
c = circuit_lookup_by_ifp (ifp, isis->init_circ_list);
|
|
|
|
c = isis_csm_state_change (ISIS_ENABLE, c, area);
|
|
|
|
c->interface = ifp; /* this is automatic */
|
|
|
|
ifp->info = c; /* hardly related to the FSM */
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
if (!c)
|
2003-12-23 09:09:43 +01:00
|
|
|
return CMD_WARNING;
|
|
|
|
|
|
|
|
c->ip_router = 1;
|
|
|
|
area->ip_circuits++;
|
|
|
|
circuit_update_nlpids (c);
|
|
|
|
|
|
|
|
vty->node = INTERFACE_NODE;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
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"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Routing process tag\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
|
|
|
struct isis_circuit *circuit = NULL;
|
|
|
|
struct interface *ifp;
|
|
|
|
struct isis_area *area;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2003-12-23 09:09:43 +01:00
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
ifp = (struct interface *) vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (ifp);
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
area = isis_area_lookup (argv[0]);
|
2004-09-10 22:48:21 +02:00
|
|
|
if (!area)
|
|
|
|
{
|
|
|
|
vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE);
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (area->circuit_list, node, nnode, circuit))
|
2003-12-23 09:09:43 +01:00
|
|
|
if (circuit->interface == ifp)
|
|
|
|
break;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (!circuit)
|
|
|
|
{
|
|
|
|
vty_out (vty, "Can't find ISIS interface %s", VTY_NEWLINE);
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit->ip_router = 0;
|
|
|
|
area->ip_circuits--;
|
|
|
|
#ifdef HAVE_IPV6
|
|
|
|
if (circuit->ipv6_router == 0)
|
|
|
|
#endif
|
|
|
|
isis_csm_state_change (ISIS_DISABLE, circuit, area);
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
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"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Level-2 only adjacencies are formed\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
struct interface *ifp;
|
|
|
|
int circuit_t;
|
|
|
|
int is_type;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
|
|
|
/* UGLY - will remove l8r */
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
|
2004-09-10 23:19:13 +02:00
|
|
|
/* XXX what to do when ip_router_isis is not executed */
|
|
|
|
if (circuit->area == NULL)
|
|
|
|
return CMD_WARNING;
|
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (circuit);
|
|
|
|
|
2004-09-26 18:24:14 +02:00
|
|
|
circuit_t = string2circuit_t ((u_char *)argv[0]);
|
2003-12-23 09:09:43 +01:00
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
if (!circuit_t)
|
|
|
|
{
|
|
|
|
vty_out (vty, "Unknown circuit-type %s", VTY_NEWLINE);
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
is_type = circuit->area->is_type;
|
|
|
|
if (is_type == IS_LEVEL_1_AND_2 || is_type == circuit_t)
|
2004-09-10 22:48:21 +02:00
|
|
|
isis_event_circuit_type_change (circuit, circuit_t);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
vty_out (vty, "invalid circuit level for area %s.%s",
|
|
|
|
circuit->area->area_tag, VTY_NEWLINE);
|
|
|
|
}
|
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
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"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Level-2 only adjacencies are formed\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
struct interface *ifp;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
|
|
|
|
|
|
|
assert (circuit);
|
2003-12-23 09:09:43 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Set the circuits level to its default value which is that of the area
|
|
|
|
*/
|
|
|
|
isis_event_circuit_type_change (circuit, circuit->area->is_type);
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (isis_passwd,
|
|
|
|
isis_passwd_cmd,
|
|
|
|
"isis password WORD",
|
|
|
|
"IS-IS commands\n"
|
|
|
|
"Configure the authentication password for interface\n"
|
|
|
|
"Password\n")
|
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
struct interface *ifp;
|
|
|
|
int len;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
len = strlen (argv[0]);
|
2004-09-10 22:48:21 +02:00
|
|
|
if (len > 254)
|
|
|
|
{
|
|
|
|
vty_out (vty, "Too long circuit password (>254)%s", VTY_NEWLINE);
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit->passwd.len = len;
|
|
|
|
circuit->passwd.type = ISIS_PASSWD_TYPE_CLEARTXT;
|
2004-09-26 18:24:14 +02:00
|
|
|
strncpy ((char *)circuit->passwd.passwd, argv[0], 255);
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (no_isis_passwd,
|
|
|
|
no_isis_passwd_cmd,
|
|
|
|
"no isis password",
|
|
|
|
NO_STR
|
|
|
|
"IS-IS commands\n"
|
|
|
|
"Configure the authentication password for interface\n")
|
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
struct interface *ifp;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
memset (&circuit->passwd, 0, sizeof (struct isis_passwd));
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
DEFUN (isis_priority,
|
|
|
|
isis_priority_cmd,
|
|
|
|
"isis priority <0-127>",
|
|
|
|
"IS-IS commands\n"
|
|
|
|
"Set priority for Designated Router election\n"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Priority value\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
struct interface *ifp;
|
|
|
|
int prio;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (circuit);
|
|
|
|
|
|
|
|
prio = atoi (argv[0]);
|
|
|
|
|
|
|
|
circuit->u.bc.priority[0] = prio;
|
|
|
|
circuit->u.bc.priority[1] = prio;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (no_isis_priority,
|
|
|
|
no_isis_priority_cmd,
|
|
|
|
"no isis priority",
|
|
|
|
NO_STR
|
|
|
|
"IS-IS commands\n"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Set priority for Designated Router election\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
struct interface *ifp;
|
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (circuit);
|
|
|
|
|
|
|
|
circuit->u.bc.priority[0] = DEFAULT_PRIORITY;
|
|
|
|
circuit->u.bc.priority[1] = DEFAULT_PRIORITY;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
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"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Priority value\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
|
|
|
|
DEFUN (isis_priority_l1,
|
|
|
|
isis_priority_l1_cmd,
|
2004-09-10 22:48:21 +02:00
|
|
|
"isis priority <0-127> level-1",
|
2003-12-23 09:09:43 +01:00
|
|
|
"IS-IS commands\n"
|
|
|
|
"Set priority for Designated Router election\n"
|
|
|
|
"Priority value\n"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Specify priority for level-1 routing\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
struct interface *ifp;
|
|
|
|
int prio;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (circuit);
|
|
|
|
|
|
|
|
prio = atoi (argv[0]);
|
|
|
|
|
|
|
|
circuit->u.bc.priority[0] = prio;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
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"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Specify priority for level-1 routing\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
struct interface *ifp;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (circuit);
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit->u.bc.priority[0] = DEFAULT_PRIORITY;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
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"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Specify priority for level-1 routing\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
|
|
|
|
DEFUN (isis_priority_l2,
|
|
|
|
isis_priority_l2_cmd,
|
2004-09-10 22:48:21 +02:00
|
|
|
"isis priority <0-127> level-2",
|
2003-12-23 09:09:43 +01:00
|
|
|
"IS-IS commands\n"
|
|
|
|
"Set priority for Designated Router election\n"
|
|
|
|
"Priority value\n"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Specify priority for level-2 routing\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
struct interface *ifp;
|
|
|
|
int prio;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (circuit);
|
|
|
|
|
|
|
|
prio = atoi (argv[0]);
|
|
|
|
|
|
|
|
circuit->u.bc.priority[1] = prio;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
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"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Specify priority for level-2 routing\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
struct interface *ifp;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (circuit);
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit->u.bc.priority[1] = DEFAULT_PRIORITY;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
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"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Specify priority for level-2 routing\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
|
|
|
|
/* Metric command */
|
2004-09-10 22:48:21 +02:00
|
|
|
DEFUN (isis_metric,
|
2003-12-23 09:09:43 +01:00
|
|
|
isis_metric_cmd,
|
2005-09-26 19:05:55 +02:00
|
|
|
"isis metric <0-16777215>",
|
2003-12-23 09:09:43 +01:00
|
|
|
"IS-IS commands\n"
|
|
|
|
"Set default metric for circuit\n"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Default metric value\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
struct interface *ifp;
|
|
|
|
int met;
|
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (circuit);
|
|
|
|
|
|
|
|
met = atoi (argv[0]);
|
|
|
|
|
2005-09-26 19:05:55 +02:00
|
|
|
circuit->te_metric[0] = met;
|
|
|
|
circuit->te_metric[1] = met;
|
|
|
|
|
|
|
|
if (met > 63)
|
|
|
|
met = 63;
|
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit->metrics[0].metric_default = met;
|
|
|
|
circuit->metrics[1].metric_default = met;
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (no_isis_metric,
|
|
|
|
no_isis_metric_cmd,
|
|
|
|
"no isis metric",
|
|
|
|
NO_STR
|
|
|
|
"IS-IS commands\n"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Set default metric for circuit\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
struct interface *ifp;
|
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (circuit);
|
|
|
|
|
2005-09-26 19:05:55 +02:00
|
|
|
circuit->te_metric[0] = DEFAULT_CIRCUIT_METRICS;
|
|
|
|
circuit->te_metric[1] = DEFAULT_CIRCUIT_METRICS;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit->metrics[0].metric_default = DEFAULT_CIRCUIT_METRICS;
|
|
|
|
circuit->metrics[1].metric_default = DEFAULT_CIRCUIT_METRICS;
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
ALIAS (no_isis_metric,
|
|
|
|
no_isis_metric_arg_cmd,
|
2005-09-26 19:05:55 +02:00
|
|
|
"no isis metric <0-16777215>",
|
2003-12-23 09:09:43 +01:00
|
|
|
NO_STR
|
|
|
|
"IS-IS commands\n"
|
|
|
|
"Set default metric for circuit\n"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Default metric value\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
/* end of metrics */
|
2005-09-26 19:05:55 +02:00
|
|
|
DEFUN (isis_hello_interval,
|
2003-12-23 09:09:43 +01:00
|
|
|
isis_hello_interval_cmd,
|
|
|
|
"isis hello-interval (<1-65535>|minimal)",
|
|
|
|
"IS-IS commands\n"
|
|
|
|
"Set Hello interval\n"
|
|
|
|
"Hello interval value\n"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Holdtime 1 seconds, interval depends on multiplier\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
struct interface *ifp;
|
|
|
|
int interval;
|
|
|
|
char c;
|
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
|
|
|
assert (circuit);
|
2003-12-23 09:09:43 +01:00
|
|
|
c = *argv[0];
|
2004-09-10 22:48:21 +02:00
|
|
|
if (isdigit ((int) c))
|
|
|
|
{
|
|
|
|
interval = atoi (argv[0]);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
interval = HELLO_MINIMAL; /* FIXME: should be calculated */
|
|
|
|
|
|
|
|
circuit->hello_interval[0] = (u_int16_t) interval;
|
|
|
|
circuit->hello_interval[1] = (u_int16_t) interval;
|
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (no_isis_hello_interval,
|
|
|
|
no_isis_hello_interval_cmd,
|
|
|
|
"no isis hello-interval",
|
|
|
|
NO_STR
|
|
|
|
"IS-IS commands\n"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Set Hello interval\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
struct interface *ifp;
|
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (circuit);
|
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
|
|
|
|
circuit->hello_interval[0] = HELLO_INTERVAL; /* Default is 1 sec. */
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit->hello_interval[1] = HELLO_INTERVAL;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
ALIAS (no_isis_hello_interval,
|
|
|
|
no_isis_hello_interval_arg_cmd,
|
|
|
|
"no isis hello-interval (<1-65535>|minimal)",
|
|
|
|
NO_STR
|
|
|
|
"IS-IS commands\n"
|
|
|
|
"Set Hello interval\n"
|
|
|
|
"Hello interval value\n"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Holdtime 1 second, interval depends on multiplier\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
|
|
|
|
DEFUN (isis_hello_interval_l1,
|
|
|
|
isis_hello_interval_l1_cmd,
|
|
|
|
"isis hello-interval (<1-65535>|minimal) level-1",
|
|
|
|
"IS-IS commands\n"
|
|
|
|
"Set Hello interval\n"
|
|
|
|
"Hello interval value\n"
|
|
|
|
"Holdtime 1 second, interval depends on multiplier\n"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Specify hello-interval for level-1 IIHs\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
struct interface *ifp;
|
|
|
|
long interval;
|
|
|
|
char c;
|
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (circuit);
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
c = *argv[0];
|
2004-09-10 22:48:21 +02:00
|
|
|
if (isdigit ((int) c))
|
|
|
|
{
|
|
|
|
interval = atoi (argv[0]);
|
|
|
|
}
|
|
|
|
else
|
2003-12-23 09:09:43 +01:00
|
|
|
interval = HELLO_MINIMAL;
|
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
circuit->hello_interval[0] = (u_int16_t) interval;
|
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (no_isis_hello_interval_l1,
|
|
|
|
no_isis_hello_interval_l1_cmd,
|
|
|
|
"no isis hello-interval level-1",
|
|
|
|
NO_STR
|
|
|
|
"IS-IS commands\n"
|
|
|
|
"Set Hello interval\n"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Specify hello-interval for level-1 IIHs\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
struct interface *ifp;
|
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (circuit);
|
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
|
|
|
|
circuit->hello_interval[0] = HELLO_INTERVAL; /* Default is 1 sec. */
|
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
ALIAS (no_isis_hello_interval_l1,
|
|
|
|
no_isis_hello_interval_l1_arg_cmd,
|
|
|
|
"no isis hello-interval (<1-65535>|minimal) level-1",
|
|
|
|
NO_STR
|
|
|
|
"IS-IS commands\n"
|
|
|
|
"Set Hello interval\n"
|
|
|
|
"Hello interval value\n"
|
|
|
|
"Holdtime 1 second, interval depends on multiplier\n"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Specify hello-interval for level-1 IIHs\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
|
|
|
|
DEFUN (isis_hello_interval_l2,
|
|
|
|
isis_hello_interval_l2_cmd,
|
|
|
|
"isis hello-interval (<1-65535>|minimal) level-2",
|
|
|
|
"IS-IS commands\n"
|
|
|
|
"Set Hello interval\n"
|
|
|
|
"Hello interval value\n"
|
|
|
|
"Holdtime 1 second, interval depends on multiplier\n"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Specify hello-interval for level-2 IIHs\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
struct interface *ifp;
|
|
|
|
long interval;
|
|
|
|
char c;
|
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (circuit);
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
c = *argv[0];
|
2004-09-10 22:48:21 +02:00
|
|
|
if (isdigit ((int) c))
|
|
|
|
{
|
|
|
|
interval = atoi (argv[0]);
|
|
|
|
}
|
|
|
|
else
|
2003-12-23 09:09:43 +01:00
|
|
|
interval = HELLO_MINIMAL;
|
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
circuit->hello_interval[1] = (u_int16_t) interval;
|
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (no_isis_hello_interval_l2,
|
|
|
|
no_isis_hello_interval_l2_cmd,
|
|
|
|
"no isis hello-interval level-2",
|
|
|
|
NO_STR
|
|
|
|
"IS-IS commands\n"
|
|
|
|
"Set Hello interval\n"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Specify hello-interval for level-2 IIHs\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
struct interface *ifp;
|
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (circuit);
|
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
|
|
|
|
circuit->hello_interval[1] = HELLO_INTERVAL; /* Default is 1 sec. */
|
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
ALIAS (no_isis_hello_interval_l2,
|
|
|
|
no_isis_hello_interval_l2_arg_cmd,
|
|
|
|
"no isis hello-interval (<1-65535>|minimal) level-2",
|
|
|
|
NO_STR
|
|
|
|
"IS-IS commands\n"
|
|
|
|
"Set Hello interval\n"
|
|
|
|
"Hello interval value\n"
|
|
|
|
"Holdtime 1 second, interval depends on multiplier\n"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Specify hello-interval for level-2 IIHs\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
|
|
|
|
DEFUN (isis_hello_multiplier,
|
|
|
|
isis_hello_multiplier_cmd,
|
|
|
|
"isis hello-multiplier <3-1000>",
|
|
|
|
"IS-IS commands\n"
|
|
|
|
"Set multiplier for Hello holding time\n"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Hello multiplier value\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
struct interface *ifp;
|
|
|
|
int mult;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (circuit);
|
|
|
|
|
|
|
|
mult = atoi (argv[0]);
|
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
circuit->hello_multiplier[0] = (u_int16_t) mult;
|
|
|
|
circuit->hello_multiplier[1] = (u_int16_t) mult;
|
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (no_isis_hello_multiplier,
|
|
|
|
no_isis_hello_multiplier_cmd,
|
|
|
|
"no isis hello-multiplier",
|
|
|
|
NO_STR
|
|
|
|
"IS-IS commands\n"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Set multiplier for Hello holding time\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
struct interface *ifp;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (circuit);
|
|
|
|
|
|
|
|
circuit->hello_multiplier[0] = HELLO_MULTIPLIER;
|
|
|
|
circuit->hello_multiplier[1] = HELLO_MULTIPLIER;
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
ALIAS (no_isis_hello_multiplier,
|
|
|
|
no_isis_hello_multiplier_arg_cmd,
|
|
|
|
"no isis hello-multiplier <3-1000>",
|
|
|
|
NO_STR
|
|
|
|
"IS-IS commands\n"
|
|
|
|
"Set multiplier for Hello holding time\n"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Hello multiplier value\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
|
|
|
|
DEFUN (isis_hello_multiplier_l1,
|
|
|
|
isis_hello_multiplier_l1_cmd,
|
|
|
|
"isis hello-multiplier <3-1000> level-1",
|
|
|
|
"IS-IS commands\n"
|
|
|
|
"Set multiplier for Hello holding time\n"
|
|
|
|
"Hello multiplier value\n"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Specify hello multiplier for level-1 IIHs\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
struct interface *ifp;
|
|
|
|
int mult;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (circuit);
|
|
|
|
|
|
|
|
mult = atoi (argv[0]);
|
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
circuit->hello_multiplier[0] = (u_int16_t) mult;
|
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (no_isis_hello_multiplier_l1,
|
|
|
|
no_isis_hello_multiplier_l1_cmd,
|
|
|
|
"no isis hello-multiplier level-1",
|
|
|
|
NO_STR
|
|
|
|
"IS-IS commands\n"
|
|
|
|
"Set multiplier for Hello holding time\n"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Specify hello multiplier for level-1 IIHs\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
struct interface *ifp;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (circuit);
|
|
|
|
|
|
|
|
circuit->hello_multiplier[0] = HELLO_MULTIPLIER;
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
ALIAS (no_isis_hello_multiplier_l1,
|
|
|
|
no_isis_hello_multiplier_l1_arg_cmd,
|
|
|
|
"no isis hello-multiplier <3-1000> level-1",
|
|
|
|
NO_STR
|
|
|
|
"IS-IS commands\n"
|
|
|
|
"Set multiplier for Hello holding time\n"
|
|
|
|
"Hello multiplier value\n"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Specify hello multiplier for level-1 IIHs\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
|
|
|
|
DEFUN (isis_hello_multiplier_l2,
|
|
|
|
isis_hello_multiplier_l2_cmd,
|
|
|
|
"isis hello-multiplier <3-1000> level-2",
|
|
|
|
"IS-IS commands\n"
|
|
|
|
"Set multiplier for Hello holding time\n"
|
|
|
|
"Hello multiplier value\n"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Specify hello multiplier for level-2 IIHs\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
struct interface *ifp;
|
|
|
|
int mult;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (circuit);
|
|
|
|
|
|
|
|
mult = atoi (argv[0]);
|
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
circuit->hello_multiplier[1] = (u_int16_t) mult;
|
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (no_isis_hello_multiplier_l2,
|
|
|
|
no_isis_hello_multiplier_l2_cmd,
|
|
|
|
"no isis hello-multiplier level-2",
|
|
|
|
NO_STR
|
|
|
|
"IS-IS commands\n"
|
|
|
|
"Set multiplier for Hello holding time\n"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Specify hello multiplier for level-2 IIHs\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
struct interface *ifp;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (circuit);
|
|
|
|
|
|
|
|
circuit->hello_multiplier[1] = HELLO_MULTIPLIER;
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
ALIAS (no_isis_hello_multiplier_l2,
|
|
|
|
no_isis_hello_multiplier_l2_arg_cmd,
|
|
|
|
"no isis hello-multiplier <3-1000> level-2",
|
|
|
|
NO_STR
|
|
|
|
"IS-IS commands\n"
|
|
|
|
"Set multiplier for Hello holding time\n"
|
|
|
|
"Hello multiplier value\n"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Specify hello multiplier for level-2 IIHs\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
|
|
|
|
DEFUN (isis_hello,
|
|
|
|
isis_hello_cmd,
|
|
|
|
"isis hello padding",
|
|
|
|
"IS-IS commands\n"
|
|
|
|
"Add padding to IS-IS hello packets\n"
|
|
|
|
"Pad hello packets\n"
|
|
|
|
"<cr>\n")
|
|
|
|
{
|
|
|
|
struct interface *ifp;
|
|
|
|
struct isis_circuit *circuit;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (circuit);
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit->u.bc.pad_hellos = 1;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (no_isis_hello,
|
|
|
|
no_isis_hello_cmd,
|
|
|
|
"no isis hello padding",
|
|
|
|
NO_STR
|
|
|
|
"IS-IS commands\n"
|
|
|
|
"Add padding to IS-IS hello packets\n"
|
|
|
|
"Pad hello packets\n"
|
|
|
|
"<cr>\n")
|
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
struct interface *ifp;
|
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (circuit);
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit->u.bc.pad_hellos = 0;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (csnp_interval,
|
|
|
|
csnp_interval_cmd,
|
|
|
|
"isis csnp-interval <0-65535>",
|
|
|
|
"IS-IS commands\n"
|
|
|
|
"Set CSNP interval in seconds\n"
|
|
|
|
"CSNP interval value\n")
|
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
struct interface *ifp;
|
|
|
|
unsigned long interval;
|
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (circuit);
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
interval = atol (argv[0]);
|
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
circuit->csnp_interval[0] = (u_int16_t) interval;
|
|
|
|
circuit->csnp_interval[1] = (u_int16_t) interval;
|
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (no_csnp_interval,
|
|
|
|
no_csnp_interval_cmd,
|
|
|
|
"no isis csnp-interval",
|
|
|
|
NO_STR
|
|
|
|
"IS-IS commands\n"
|
2004-09-10 22:48:21 +02:00
|
|
|
"Set CSNP interval in seconds\n")
|
2003-12-23 09:09:43 +01:00
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
struct interface *ifp;
|
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (circuit);
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit->csnp_interval[0] = CSNP_INTERVAL;
|
|
|
|
circuit->csnp_interval[1] = CSNP_INTERVAL;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
ALIAS (no_csnp_interval,
|
|
|
|
no_csnp_interval_arg_cmd,
|
|
|
|
"no isis csnp-interval <0-65535>",
|
|
|
|
NO_STR
|
|
|
|
"IS-IS commands\n"
|
|
|
|
"Set CSNP interval in seconds\n"
|
|
|
|
"CSNP interval value\n")
|
|
|
|
|
|
|
|
DEFUN (csnp_interval_l1,
|
|
|
|
csnp_interval_l1_cmd,
|
|
|
|
"isis csnp-interval <0-65535> level-1",
|
|
|
|
"IS-IS commands\n"
|
|
|
|
"Set CSNP interval in seconds\n"
|
|
|
|
"CSNP interval value\n"
|
|
|
|
"Specify interval for level-1 CSNPs\n")
|
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
struct interface *ifp;
|
|
|
|
unsigned long interval;
|
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (circuit);
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
interval = atol (argv[0]);
|
2004-09-10 22:48:21 +02:00
|
|
|
|
|
|
|
circuit->csnp_interval[0] = (u_int16_t) interval;
|
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (no_csnp_interval_l1,
|
|
|
|
no_csnp_interval_l1_cmd,
|
|
|
|
"no isis csnp-interval level-1",
|
|
|
|
NO_STR
|
|
|
|
"IS-IS commands\n"
|
|
|
|
"Set CSNP interval in seconds\n"
|
|
|
|
"Specify interval for level-1 CSNPs\n")
|
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
struct interface *ifp;
|
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (circuit);
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit->csnp_interval[0] = CSNP_INTERVAL;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
ALIAS (no_csnp_interval_l1,
|
|
|
|
no_csnp_interval_l1_arg_cmd,
|
|
|
|
"no isis csnp-interval <0-65535> level-1",
|
|
|
|
NO_STR
|
|
|
|
"IS-IS commands\n"
|
|
|
|
"Set CSNP interval in seconds\n"
|
|
|
|
"CSNP interval value\n"
|
|
|
|
"Specify interval for level-1 CSNPs\n")
|
|
|
|
|
|
|
|
DEFUN (csnp_interval_l2,
|
|
|
|
csnp_interval_l2_cmd,
|
|
|
|
"isis csnp-interval <0-65535> level-2",
|
|
|
|
"IS-IS commands\n"
|
|
|
|
"Set CSNP interval in seconds\n"
|
|
|
|
"CSNP interval value\n"
|
|
|
|
"Specify interval for level-2 CSNPs\n")
|
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
struct interface *ifp;
|
|
|
|
unsigned long interval;
|
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (circuit);
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
interval = atol (argv[0]);
|
2004-09-10 22:48:21 +02:00
|
|
|
|
|
|
|
circuit->csnp_interval[1] = (u_int16_t) interval;
|
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (no_csnp_interval_l2,
|
|
|
|
no_csnp_interval_l2_cmd,
|
|
|
|
"no isis csnp-interval level-2",
|
|
|
|
NO_STR
|
|
|
|
"IS-IS commands\n"
|
|
|
|
"Set CSNP interval in seconds\n"
|
|
|
|
"Specify interval for level-2 CSNPs\n")
|
|
|
|
{
|
|
|
|
struct isis_circuit *circuit;
|
|
|
|
struct interface *ifp;
|
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
ifp = vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit = ifp->info;
|
2004-09-10 22:48:21 +02:00
|
|
|
if (circuit == NULL)
|
|
|
|
{
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (circuit);
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
circuit->csnp_interval[1] = CSNP_INTERVAL;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
ALIAS (no_csnp_interval_l2,
|
|
|
|
no_csnp_interval_l2_arg_cmd,
|
|
|
|
"no isis csnp-interval <0-65535> level-2",
|
|
|
|
NO_STR
|
|
|
|
"IS-IS commands\n"
|
|
|
|
"Set CSNP interval in seconds\n"
|
|
|
|
"CSNP interval value\n"
|
|
|
|
"Specify interval for level-2 CSNPs\n")
|
|
|
|
|
|
|
|
#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 *c;
|
|
|
|
struct interface *ifp;
|
|
|
|
struct isis_area *area;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
|
|
|
ifp = (struct interface *) vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (ifp);
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
area = isis_area_lookup (argv[0]);
|
|
|
|
|
|
|
|
/* Prevent more than one circuit per interface */
|
|
|
|
if (area)
|
|
|
|
c = circuit_lookup_by_ifp (ifp, area->circuit_list);
|
2004-09-10 22:48:21 +02:00
|
|
|
else
|
|
|
|
c = NULL;
|
|
|
|
|
|
|
|
if (c && (ifp->info != NULL))
|
|
|
|
{
|
|
|
|
if (c->ipv6_router == 1)
|
|
|
|
{
|
|
|
|
vty_out (vty, "ISIS circuit is already defined for IPv6%s",
|
|
|
|
VTY_NEWLINE);
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/* this is here for ciscopability */
|
2004-09-10 22:48:21 +02:00
|
|
|
if (!area)
|
|
|
|
{
|
|
|
|
vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE);
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
if (!c)
|
|
|
|
{
|
|
|
|
c = circuit_lookup_by_ifp (ifp, isis->init_circ_list);
|
|
|
|
c = isis_csm_state_change (ISIS_ENABLE, c, area);
|
|
|
|
c->interface = ifp;
|
|
|
|
ifp->info = c;
|
|
|
|
}
|
2003-12-23 09:09:43 +01:00
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
if (!c)
|
2003-12-23 09:09:43 +01:00
|
|
|
return CMD_WARNING;
|
|
|
|
|
|
|
|
c->ipv6_router = 1;
|
|
|
|
area->ipv6_circuits++;
|
|
|
|
circuit_update_nlpids (c);
|
|
|
|
|
|
|
|
vty->node = INTERFACE_NODE;
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
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")
|
|
|
|
{
|
|
|
|
struct isis_circuit *c;
|
|
|
|
struct interface *ifp;
|
|
|
|
struct isis_area *area;
|
2004-09-10 22:48:21 +02:00
|
|
|
|
|
|
|
ifp = (struct interface *) vty->index;
|
2003-12-23 09:09:43 +01:00
|
|
|
/* UGLY - will remove l8r
|
|
|
|
if (circuit == NULL) {
|
2004-09-10 22:48:21 +02:00
|
|
|
return CMD_WARNING;
|
|
|
|
} */
|
2003-12-23 09:09:43 +01:00
|
|
|
assert (ifp);
|
2004-09-10 22:48:21 +02:00
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
area = isis_area_lookup (argv[0]);
|
2004-09-10 22:48:21 +02:00
|
|
|
if (!area)
|
|
|
|
{
|
|
|
|
vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE);
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
|
|
|
|
2003-12-23 09:09:43 +01:00
|
|
|
c = circuit_lookup_by_ifp (ifp, area->circuit_list);
|
|
|
|
if (!c)
|
|
|
|
return CMD_WARNING;
|
|
|
|
|
|
|
|
c->ipv6_router = 0;
|
|
|
|
area->ipv6_circuits--;
|
|
|
|
if (c->ip_router == 0)
|
|
|
|
isis_csm_state_change (ISIS_DISABLE, c, area);
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
2004-09-10 22:48:21 +02:00
|
|
|
#endif /* HAVE_IPV6 */
|
2003-12-23 09:09:43 +01:00
|
|
|
|
2004-09-10 22:48:21 +02:00
|
|
|
struct cmd_node interface_node = {
|
2003-12-23 09:09:43 +01:00
|
|
|
INTERFACE_NODE,
|
|
|
|
"%s(config-if)# ",
|
|
|
|
1,
|
|
|
|
};
|
|
|
|
|
|
|
|
int
|
|
|
|
isis_if_new_hook (struct interface *ifp)
|
|
|
|
{
|
|
|
|
/* FIXME: Discuss if the circuit should be created here
|
|
|
|
ifp->info = XMALLOC (MTYPE_ISIS_IF_INFO, sizeof (struct isis_if_info)); */
|
|
|
|
ifp->info = NULL;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
isis_if_delete_hook (struct interface *ifp)
|
|
|
|
{
|
|
|
|
/* FIXME: Discuss if the circuit should be created here
|
|
|
|
XFREE (MTYPE_ISIS_IF_INFO, ifp->info);*/
|
|
|
|
ifp->info = NULL;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
isis_circuit_init ()
|
|
|
|
{
|
|
|
|
/* Initialize Zebra interface data structure */
|
|
|
|
if_init ();
|
|
|
|
if_add_hook (IF_NEW_HOOK, isis_if_new_hook);
|
|
|
|
if_add_hook (IF_DELETE_HOOK, isis_if_delete_hook);
|
|
|
|
|
|
|
|
/* Install interface node */
|
|
|
|
install_node (&interface_node, isis_interface_config_write);
|
|
|
|
install_element (CONFIG_NODE, &interface_cmd);
|
|
|
|
|
|
|
|
install_default (INTERFACE_NODE);
|
|
|
|
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_circuit_type_cmd);
|
|
|
|
install_element (INTERFACE_NODE, &no_isis_circuit_type_cmd);
|
|
|
|
|
|
|
|
install_element (INTERFACE_NODE, &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_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, &isis_hello_interval_l1_cmd);
|
|
|
|
install_element (INTERFACE_NODE, &no_isis_hello_interval_l1_cmd);
|
|
|
|
install_element (INTERFACE_NODE, &no_isis_hello_interval_l1_arg_cmd);
|
|
|
|
install_element (INTERFACE_NODE, &isis_hello_interval_l2_cmd);
|
|
|
|
install_element (INTERFACE_NODE, &no_isis_hello_interval_l2_cmd);
|
|
|
|
install_element (INTERFACE_NODE, &no_isis_hello_interval_l2_arg_cmd);
|
|
|
|
|
|
|
|
install_element (INTERFACE_NODE, &isis_hello_multiplier_cmd);
|
|
|
|
install_element (INTERFACE_NODE, &no_isis_hello_multiplier_cmd);
|
|
|
|
install_element (INTERFACE_NODE, &no_isis_hello_multiplier_arg_cmd);
|
|
|
|
install_element (INTERFACE_NODE, &isis_hello_multiplier_l1_cmd);
|
|
|
|
install_element (INTERFACE_NODE, &no_isis_hello_multiplier_l1_cmd);
|
|
|
|
install_element (INTERFACE_NODE, &no_isis_hello_multiplier_l1_arg_cmd);
|
|
|
|
install_element (INTERFACE_NODE, &isis_hello_multiplier_l2_cmd);
|
|
|
|
install_element (INTERFACE_NODE, &no_isis_hello_multiplier_l2_cmd);
|
|
|
|
install_element (INTERFACE_NODE, &no_isis_hello_multiplier_l2_arg_cmd);
|
|
|
|
|
|
|
|
install_element (INTERFACE_NODE, &isis_hello_cmd);
|
|
|
|
install_element (INTERFACE_NODE, &no_isis_hello_cmd);
|
|
|
|
install_element (INTERFACE_NODE, &csnp_interval_cmd);
|
|
|
|
install_element (INTERFACE_NODE, &no_csnp_interval_cmd);
|
|
|
|
install_element (INTERFACE_NODE, &no_csnp_interval_arg_cmd);
|
|
|
|
install_element (INTERFACE_NODE, &csnp_interval_l1_cmd);
|
|
|
|
install_element (INTERFACE_NODE, &no_csnp_interval_l1_cmd);
|
|
|
|
install_element (INTERFACE_NODE, &no_csnp_interval_l1_arg_cmd);
|
|
|
|
install_element (INTERFACE_NODE, &csnp_interval_l2_cmd);
|
|
|
|
install_element (INTERFACE_NODE, &no_csnp_interval_l2_cmd);
|
|
|
|
install_element (INTERFACE_NODE, &no_csnp_interval_l2_arg_cmd);
|
|
|
|
|
|
|
|
#ifdef HAVE_IPV6
|
|
|
|
install_element (INTERFACE_NODE, &ipv6_router_isis_cmd);
|
|
|
|
install_element (INTERFACE_NODE, &no_ipv6_router_isis_cmd);
|
|
|
|
#endif
|
|
|
|
}
|