blob: d3bddc06359a9b9e994ec7c3c60180ca8bb1fdce [file] [log] [blame]
jardineb5d44e2003-12-23 08:09:43 +00001/*
2 * IS-IS Rout(e)ing protocol - isisd.c
3 *
4 * Copyright (C) 2001,2002 Sampo Saaristo
5 * Tampere University of Technology
6 * Institute of Communications Engineering
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public Licenseas published by the Free
10 * Software Foundation; either version 2 of the License, or (at your option)
11 * any later version.
12 *
13 * This program is distributed in the hope that it will be useful,but WITHOUT
14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
16 * more details.
17
18 * You should have received a copy of the GNU General Public License along
19 * with this program; if not, write to the Free Software Foundation, Inc.,
20 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 */
22
jardineb5d44e2003-12-23 08:09:43 +000023#include <zebra.h>
jardineb5d44e2003-12-23 08:09:43 +000024
25#include "thread.h"
26#include "vty.h"
27#include "command.h"
28#include "log.h"
29#include "memory.h"
Josh Bailey3f045a02012-03-24 08:35:20 -070030#include "time.h"
jardineb5d44e2003-12-23 08:09:43 +000031#include "linklist.h"
32#include "if.h"
33#include "hash.h"
34#include "stream.h"
35#include "prefix.h"
36#include "table.h"
37
38#include "isisd/dict.h"
39#include "isisd/include-netbsd/iso.h"
40#include "isisd/isis_constants.h"
41#include "isisd/isis_common.h"
jardineb5d44e2003-12-23 08:09:43 +000042#include "isisd/isis_flags.h"
Josh Bailey3f045a02012-03-24 08:35:20 -070043#include "isisd/isis_circuit.h"
44#include "isisd/isis_csm.h"
jardineb5d44e2003-12-23 08:09:43 +000045#include "isisd/isisd.h"
46#include "isisd/isis_dynhn.h"
47#include "isisd/isis_adjacency.h"
48#include "isisd/isis_pdu.h"
49#include "isisd/isis_misc.h"
50#include "isisd/isis_constants.h"
51#include "isisd/isis_tlv.h"
52#include "isisd/isis_lsp.h"
53#include "isisd/isis_spf.h"
54#include "isisd/isis_route.h"
55#include "isisd/isis_zebra.h"
56#include "isisd/isis_events.h"
Olivier Dugeon4f593572016-04-19 19:03:05 +020057#include "isisd/isis_te.h"
jardineb5d44e2003-12-23 08:09:43 +000058
59#ifdef TOPOLOGY_GENERATE
60#include "spgrid.h"
hassof390d2c2004-09-10 20:48:21 +000061u_char DEFAULT_TOPOLOGY_BASEIS[6] = { 0xFE, 0xED, 0xFE, 0xED, 0x00, 0x00 };
jardineb5d44e2003-12-23 08:09:43 +000062#endif /* TOPOLOGY_GENERATE */
63
jardineb5d44e2003-12-23 08:09:43 +000064struct isis *isis = NULL;
jardineb5d44e2003-12-23 08:09:43 +000065
Paul Jakma41b36e92006-12-08 01:09:50 +000066/*
67 * Prototypes.
68 */
Paul Jakma41b36e92006-12-08 01:09:50 +000069int isis_area_get(struct vty *, const char *);
70int isis_area_destroy(struct vty *, const char *);
Josh Bailey3f045a02012-03-24 08:35:20 -070071int area_net_title(struct vty *, const char *);
72int area_clear_net_title(struct vty *, const char *);
73int show_isis_interface_common(struct vty *, const char *ifname, char);
74int show_isis_neighbor_common(struct vty *, const char *id, char);
75int clear_isis_neighbor_common(struct vty *, const char *id);
Paul Jakma41b36e92006-12-08 01:09:50 +000076int isis_config_write(struct vty *);
77
78
79
jardineb5d44e2003-12-23 08:09:43 +000080void
81isis_new (unsigned long process_id)
82{
hassoaac372f2005-09-01 17:52:33 +000083 isis = XCALLOC (MTYPE_ISIS, sizeof (struct isis));
jardineb5d44e2003-12-23 08:09:43 +000084 /*
85 * Default values
86 */
87 isis->max_area_addrs = 3;
jardineb5d44e2003-12-23 08:09:43 +000088 isis->process_id = process_id;
Josh Bailey3f045a02012-03-24 08:35:20 -070089 isis->router_id = 0;
jardineb5d44e2003-12-23 08:09:43 +000090 isis->area_list = list_new ();
91 isis->init_circ_list = list_new ();
92 isis->uptime = time (NULL);
93 isis->nexthops = list_new ();
94#ifdef HAVE_IPV6
95 isis->nexthops6 = list_new ();
96#endif /* HAVE_IPV6 */
Josh Bailey3f045a02012-03-24 08:35:20 -070097 dyn_cache_init ();
jardineb5d44e2003-12-23 08:09:43 +000098 /*
99 * uncomment the next line for full debugs
100 */
hassof390d2c2004-09-10 20:48:21 +0000101 /* isis->debugs = 0xFFFF; */
Olivier Dugeon4f593572016-04-19 19:03:05 +0200102 isisMplsTE.status = disable; /* Only support TE metric */
jardineb5d44e2003-12-23 08:09:43 +0000103}
104
105struct isis_area *
Josh Bailey3f045a02012-03-24 08:35:20 -0700106isis_area_create (const char *area_tag)
jardineb5d44e2003-12-23 08:09:43 +0000107{
jardineb5d44e2003-12-23 08:09:43 +0000108 struct isis_area *area;
hassof390d2c2004-09-10 20:48:21 +0000109
hassoaac372f2005-09-01 17:52:33 +0000110 area = XCALLOC (MTYPE_ISIS_AREA, sizeof (struct isis_area));
jardineb5d44e2003-12-23 08:09:43 +0000111
112 /*
113 * The first instance is level-1-2 rest are level-1, unless otherwise
114 * configured
115 */
116 if (listcount (isis->area_list) > 0)
117 area->is_type = IS_LEVEL_1;
118 else
119 area->is_type = IS_LEVEL_1_AND_2;
Josh Bailey3f045a02012-03-24 08:35:20 -0700120
jardineb5d44e2003-12-23 08:09:43 +0000121 /*
122 * intialize the databases
123 */
Josh Bailey3f045a02012-03-24 08:35:20 -0700124 if (area->is_type & IS_LEVEL_1)
125 {
126 area->lspdb[0] = lsp_db_init ();
127 area->route_table[0] = route_table_init ();
128#ifdef HAVE_IPV6
129 area->route_table6[0] = route_table_init ();
130#endif /* HAVE_IPV6 */
131 }
132 if (area->is_type & IS_LEVEL_2)
133 {
134 area->lspdb[1] = lsp_db_init ();
135 area->route_table[1] = route_table_init ();
136#ifdef HAVE_IPV6
137 area->route_table6[1] = route_table_init ();
138#endif /* HAVE_IPV6 */
139 }
hassof390d2c2004-09-10 20:48:21 +0000140
jardineb5d44e2003-12-23 08:09:43 +0000141 spftree_area_init (area);
Josh Bailey3f045a02012-03-24 08:35:20 -0700142
jardineb5d44e2003-12-23 08:09:43 +0000143 area->circuit_list = list_new ();
144 area->area_addrs = list_new ();
hassof390d2c2004-09-10 20:48:21 +0000145 THREAD_TIMER_ON (master, area->t_tick, lsp_tick, area, 1);
Paul Jakmac7350c42008-01-29 19:29:44 +0000146 flags_initialize (&area->flags);
Josh Bailey3f045a02012-03-24 08:35:20 -0700147
jardineb5d44e2003-12-23 08:09:43 +0000148 /*
149 * Default values
150 */
Josh Bailey3f045a02012-03-24 08:35:20 -0700151 area->max_lsp_lifetime[0] = DEFAULT_LSP_LIFETIME; /* 1200 */
152 area->max_lsp_lifetime[1] = DEFAULT_LSP_LIFETIME; /* 1200 */
153 area->lsp_refresh[0] = DEFAULT_MAX_LSP_GEN_INTERVAL; /* 900 */
154 area->lsp_refresh[1] = DEFAULT_MAX_LSP_GEN_INTERVAL; /* 900 */
155 area->lsp_gen_interval[0] = DEFAULT_MIN_LSP_GEN_INTERVAL;
156 area->lsp_gen_interval[1] = DEFAULT_MIN_LSP_GEN_INTERVAL;
jardineb5d44e2003-12-23 08:09:43 +0000157 area->min_spf_interval[0] = MINIMUM_SPF_INTERVAL;
158 area->min_spf_interval[1] = MINIMUM_SPF_INTERVAL;
159 area->dynhostname = 1;
Josh Bailey3f045a02012-03-24 08:35:20 -0700160 area->oldmetric = 0;
161 area->newmetric = 1;
jardineb5d44e2003-12-23 08:09:43 +0000162 area->lsp_frag_threshold = 90;
Christian Frankef1fc1db2015-11-10 18:43:31 +0100163 area->lsp_mtu = DEFAULT_LSP_MTU;
jardineb5d44e2003-12-23 08:09:43 +0000164#ifdef TOPOLOGY_GENERATE
165 memcpy (area->topology_baseis, DEFAULT_TOPOLOGY_BASEIS, ISIS_SYS_ID_LEN);
166#endif /* TOPOLOGY_GENERATE */
167
Josh Bailey3f045a02012-03-24 08:35:20 -0700168 area->area_tag = strdup (area_tag);
169 listnode_add (isis->area_list, area);
170 area->isis = isis;
171
jardineb5d44e2003-12-23 08:09:43 +0000172 return area;
173}
174
175struct isis_area *
hassof90a5f62004-10-11 13:11:56 +0000176isis_area_lookup (const char *area_tag)
jardineb5d44e2003-12-23 08:09:43 +0000177{
178 struct isis_area *area;
hasso3fdb2dd2005-09-28 18:45:54 +0000179 struct listnode *node;
hassof390d2c2004-09-10 20:48:21 +0000180
hasso3fdb2dd2005-09-28 18:45:54 +0000181 for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
jardineb5d44e2003-12-23 08:09:43 +0000182 if ((area->area_tag == NULL && area_tag == NULL) ||
hassof390d2c2004-09-10 20:48:21 +0000183 (area->area_tag && area_tag
184 && strcmp (area->area_tag, area_tag) == 0))
185 return area;
186
jardineb5d44e2003-12-23 08:09:43 +0000187 return NULL;
188}
189
hassof390d2c2004-09-10 20:48:21 +0000190int
hassof90a5f62004-10-11 13:11:56 +0000191isis_area_get (struct vty *vty, const char *area_tag)
jardineb5d44e2003-12-23 08:09:43 +0000192{
jardineb5d44e2003-12-23 08:09:43 +0000193 struct isis_area *area;
hassof390d2c2004-09-10 20:48:21 +0000194
jardineb5d44e2003-12-23 08:09:43 +0000195 area = isis_area_lookup (area_tag);
hassof390d2c2004-09-10 20:48:21 +0000196
197 if (area)
198 {
199 vty->node = ISIS_NODE;
200 vty->index = area;
201 return CMD_SUCCESS;
202 }
203
Josh Bailey3f045a02012-03-24 08:35:20 -0700204 area = isis_area_create (area_tag);
hassof390d2c2004-09-10 20:48:21 +0000205
hassoc89c05d2005-09-04 21:36:36 +0000206 if (isis->debugs & DEBUG_EVENTS)
207 zlog_debug ("New IS-IS area instance %s", area->area_tag);
jardineb5d44e2003-12-23 08:09:43 +0000208
209 vty->node = ISIS_NODE;
210 vty->index = area;
hassof390d2c2004-09-10 20:48:21 +0000211
jardineb5d44e2003-12-23 08:09:43 +0000212 return CMD_SUCCESS;
213}
214
215int
hassof90a5f62004-10-11 13:11:56 +0000216isis_area_destroy (struct vty *vty, const char *area_tag)
jardineb5d44e2003-12-23 08:09:43 +0000217{
jardineb5d44e2003-12-23 08:09:43 +0000218 struct isis_area *area;
paul1eb8ef22005-04-07 07:30:20 +0000219 struct listnode *node, *nnode;
jardineb5d44e2003-12-23 08:09:43 +0000220 struct isis_circuit *circuit;
Josh Bailey3f045a02012-03-24 08:35:20 -0700221 struct area_addr *addr;
jardineb5d44e2003-12-23 08:09:43 +0000222
223 area = isis_area_lookup (area_tag);
jardineb5d44e2003-12-23 08:09:43 +0000224
hassof390d2c2004-09-10 20:48:21 +0000225 if (area == NULL)
226 {
227 vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE);
Josh Bailey3f045a02012-03-24 08:35:20 -0700228 return CMD_ERR_NO_MATCH;
jardineb5d44e2003-12-23 08:09:43 +0000229 }
hassof390d2c2004-09-10 20:48:21 +0000230
231 if (area->circuit_list)
232 {
paul1eb8ef22005-04-07 07:30:20 +0000233 for (ALL_LIST_ELEMENTS (area->circuit_list, node, nnode, circuit))
Josh Bailey3f045a02012-03-24 08:35:20 -0700234 {
235 circuit->ip_router = 0;
236#ifdef HAVE_IPV6
237 circuit->ipv6_router = 0;
238#endif
239 isis_csm_state_change (ISIS_DISABLE, circuit, area);
240 }
hassof390d2c2004-09-10 20:48:21 +0000241 list_delete (area->circuit_list);
Josh Bailey3f045a02012-03-24 08:35:20 -0700242 area->circuit_list = NULL;
hassof390d2c2004-09-10 20:48:21 +0000243 }
Josh Bailey3f045a02012-03-24 08:35:20 -0700244
245 if (area->lspdb[0] != NULL)
246 {
247 lsp_db_destroy (area->lspdb[0]);
248 area->lspdb[0] = NULL;
249 }
250 if (area->lspdb[1] != NULL)
251 {
252 lsp_db_destroy (area->lspdb[1]);
253 area->lspdb[1] = NULL;
254 }
255
256 spftree_area_del (area);
257
258 /* invalidate and validate would delete all routes from zebra */
259 isis_route_invalidate (area);
260 isis_route_validate (area);
261
262 if (area->route_table[0])
263 {
264 route_table_finish (area->route_table[0]);
265 area->route_table[0] = NULL;
266 }
267 if (area->route_table[1])
268 {
269 route_table_finish (area->route_table[1]);
270 area->route_table[1] = NULL;
271 }
272#ifdef HAVE_IPV6
273 if (area->route_table6[0])
274 {
275 route_table_finish (area->route_table6[0]);
276 area->route_table6[0] = NULL;
277 }
278 if (area->route_table6[1])
279 {
280 route_table_finish (area->route_table6[1]);
281 area->route_table6[1] = NULL;
282 }
283#endif /* HAVE_IPV6 */
284
Christian Frankeacf98652015-11-12 14:24:22 +0100285 isis_redist_area_finish(area);
286
Josh Bailey3f045a02012-03-24 08:35:20 -0700287 for (ALL_LIST_ELEMENTS (area->area_addrs, node, nnode, addr))
288 {
289 list_delete_node (area->area_addrs, node);
290 XFREE (MTYPE_ISIS_AREA_ADDR, addr);
291 }
292 area->area_addrs = NULL;
293
hassof390d2c2004-09-10 20:48:21 +0000294 THREAD_TIMER_OFF (area->t_tick);
hassof390d2c2004-09-10 20:48:21 +0000295 THREAD_TIMER_OFF (area->t_lsp_refresh[0]);
296 THREAD_TIMER_OFF (area->t_lsp_refresh[1]);
jardineb5d44e2003-12-23 08:09:43 +0000297
Josh Bailey3f045a02012-03-24 08:35:20 -0700298 thread_cancel_event (master, area);
299
300 listnode_delete (isis->area_list, area);
301
302 free (area->area_tag);
303
jardineb5d44e2003-12-23 08:09:43 +0000304 XFREE (MTYPE_ISIS_AREA, area);
hassof390d2c2004-09-10 20:48:21 +0000305
Josh Bailey3f045a02012-03-24 08:35:20 -0700306 if (listcount (isis->area_list) == 0)
307 {
308 memset (isis->sysid, 0, ISIS_SYS_ID_LEN);
309 isis->sysid_set = 0;
310 }
311
jardineb5d44e2003-12-23 08:09:43 +0000312 return CMD_SUCCESS;
313}
314
hassof390d2c2004-09-10 20:48:21 +0000315int
Josh Bailey3f045a02012-03-24 08:35:20 -0700316area_net_title (struct vty *vty, const char *net_title)
jardineb5d44e2003-12-23 08:09:43 +0000317{
jardineb5d44e2003-12-23 08:09:43 +0000318 struct isis_area *area;
319 struct area_addr *addr;
320 struct area_addr *addrp;
hasso3fdb2dd2005-09-28 18:45:54 +0000321 struct listnode *node;
jardineb5d44e2003-12-23 08:09:43 +0000322
323 u_char buff[255];
324 area = vty->index;
325
hassof390d2c2004-09-10 20:48:21 +0000326 if (!area)
327 {
328 vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE);
Josh Bailey3f045a02012-03-24 08:35:20 -0700329 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +0000330 }
jardineb5d44e2003-12-23 08:09:43 +0000331
332 /* We check that we are not over the maximal number of addresses */
hassof390d2c2004-09-10 20:48:21 +0000333 if (listcount (area->area_addrs) >= isis->max_area_addrs)
334 {
335 vty_out (vty, "Maximum of area addresses (%d) already reached %s",
336 isis->max_area_addrs, VTY_NEWLINE);
Josh Bailey3f045a02012-03-24 08:35:20 -0700337 return CMD_ERR_NOTHING_TODO;
hassof390d2c2004-09-10 20:48:21 +0000338 }
jardineb5d44e2003-12-23 08:09:43 +0000339
340 addr = XMALLOC (MTYPE_ISIS_AREA_ADDR, sizeof (struct area_addr));
341 addr->addr_len = dotformat2buff (buff, net_title);
342 memcpy (addr->area_addr, buff, addr->addr_len);
343#ifdef EXTREME_DEBUG
hasso529d65b2004-12-24 00:14:50 +0000344 zlog_debug ("added area address %s for area %s (address length %d)",
jardineb5d44e2003-12-23 08:09:43 +0000345 net_title, area->area_tag, addr->addr_len);
346#endif /* EXTREME_DEBUG */
hassof390d2c2004-09-10 20:48:21 +0000347 if (addr->addr_len < 8 || addr->addr_len > 20)
348 {
Josh Bailey3f045a02012-03-24 08:35:20 -0700349 vty_out (vty, "area address must be at least 8..20 octets long (%d)%s",
350 addr->addr_len, VTY_NEWLINE);
jardineb5d44e2003-12-23 08:09:43 +0000351 XFREE (MTYPE_ISIS_AREA_ADDR, addr);
Josh Bailey3f045a02012-03-24 08:35:20 -0700352 return CMD_ERR_AMBIGUOUS;
353 }
354
355 if (addr->area_addr[addr->addr_len-1] != 0)
356 {
357 vty_out (vty, "nsel byte (last byte) in area address must be 0%s",
358 VTY_NEWLINE);
359 XFREE (MTYPE_ISIS_AREA_ADDR, addr);
360 return CMD_ERR_AMBIGUOUS;
jardineb5d44e2003-12-23 08:09:43 +0000361 }
362
hassof390d2c2004-09-10 20:48:21 +0000363 if (isis->sysid_set == 0)
364 {
365 /*
366 * First area address - get the SystemID for this router
367 */
Josh Bailey3f045a02012-03-24 08:35:20 -0700368 memcpy (isis->sysid, GETSYSID (addr), ISIS_SYS_ID_LEN);
hassof390d2c2004-09-10 20:48:21 +0000369 isis->sysid_set = 1;
hassoc89c05d2005-09-04 21:36:36 +0000370 if (isis->debugs & DEBUG_EVENTS)
371 zlog_debug ("Router has SystemID %s", sysid_print (isis->sysid));
jardineb5d44e2003-12-23 08:09:43 +0000372 }
hassof390d2c2004-09-10 20:48:21 +0000373 else
374 {
375 /*
376 * Check that the SystemID portions match
377 */
Josh Bailey3f045a02012-03-24 08:35:20 -0700378 if (memcmp (isis->sysid, GETSYSID (addr), ISIS_SYS_ID_LEN))
hassof390d2c2004-09-10 20:48:21 +0000379 {
380 vty_out (vty,
381 "System ID must not change when defining additional area"
382 " addresses%s", VTY_NEWLINE);
383 XFREE (MTYPE_ISIS_AREA_ADDR, addr);
Josh Bailey3f045a02012-03-24 08:35:20 -0700384 return CMD_ERR_AMBIGUOUS;
hassof390d2c2004-09-10 20:48:21 +0000385 }
jardineb5d44e2003-12-23 08:09:43 +0000386
hassof390d2c2004-09-10 20:48:21 +0000387 /* now we see that we don't already have this address */
hasso3fdb2dd2005-09-28 18:45:54 +0000388 for (ALL_LIST_ELEMENTS_RO (area->area_addrs, node, addrp))
389 {
Josh Bailey3f045a02012-03-24 08:35:20 -0700390 if ((addrp->addr_len + ISIS_SYS_ID_LEN + ISIS_NSEL_LEN) != (addr->addr_len))
hasso3fdb2dd2005-09-28 18:45:54 +0000391 continue;
392 if (!memcmp (addrp->area_addr, addr->area_addr, addr->addr_len))
393 {
394 XFREE (MTYPE_ISIS_AREA_ADDR, addr);
395 return CMD_SUCCESS; /* silent fail */
396 }
397 }
hassof390d2c2004-09-10 20:48:21 +0000398 }
Josh Bailey3f045a02012-03-24 08:35:20 -0700399
jardineb5d44e2003-12-23 08:09:43 +0000400 /*
401 * Forget the systemID part of the address
402 */
Josh Bailey3f045a02012-03-24 08:35:20 -0700403 addr->addr_len -= (ISIS_SYS_ID_LEN + ISIS_NSEL_LEN);
jardineb5d44e2003-12-23 08:09:43 +0000404 listnode_add (area->area_addrs, addr);
405
406 /* only now we can safely generate our LSPs for this area */
hassof390d2c2004-09-10 20:48:21 +0000407 if (listcount (area->area_addrs) > 0)
408 {
Josh Bailey3f045a02012-03-24 08:35:20 -0700409 if (area->is_type & IS_LEVEL_1)
410 lsp_generate (area, IS_LEVEL_1);
411 if (area->is_type & IS_LEVEL_2)
412 lsp_generate (area, IS_LEVEL_2);
hassof390d2c2004-09-10 20:48:21 +0000413 }
jardineb5d44e2003-12-23 08:09:43 +0000414
415 return CMD_SUCCESS;
416}
417
418int
Josh Bailey3f045a02012-03-24 08:35:20 -0700419area_clear_net_title (struct vty *vty, const char *net_title)
jardineb5d44e2003-12-23 08:09:43 +0000420{
421 struct isis_area *area;
hassof390d2c2004-09-10 20:48:21 +0000422 struct area_addr addr, *addrp = NULL;
hasso3fdb2dd2005-09-28 18:45:54 +0000423 struct listnode *node;
jardineb5d44e2003-12-23 08:09:43 +0000424 u_char buff[255];
425
426 area = vty->index;
hassof390d2c2004-09-10 20:48:21 +0000427 if (!area)
428 {
429 vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE);
Josh Bailey3f045a02012-03-24 08:35:20 -0700430 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +0000431 }
432
jardineb5d44e2003-12-23 08:09:43 +0000433 addr.addr_len = dotformat2buff (buff, net_title);
hassof390d2c2004-09-10 20:48:21 +0000434 if (addr.addr_len < 8 || addr.addr_len > 20)
435 {
436 vty_out (vty, "Unsupported area address length %d, should be 8...20 %s",
437 addr.addr_len, VTY_NEWLINE);
Josh Bailey3f045a02012-03-24 08:35:20 -0700438 return CMD_ERR_AMBIGUOUS;
hassof390d2c2004-09-10 20:48:21 +0000439 }
440
441 memcpy (addr.area_addr, buff, (int) addr.addr_len);
442
hasso3fdb2dd2005-09-28 18:45:54 +0000443 for (ALL_LIST_ELEMENTS_RO (area->area_addrs, node, addrp))
Josh Bailey3f045a02012-03-24 08:35:20 -0700444 if ((addrp->addr_len + ISIS_SYS_ID_LEN + 1) == addr.addr_len &&
jardineb5d44e2003-12-23 08:09:43 +0000445 !memcmp (addrp->area_addr, addr.area_addr, addr.addr_len))
hassof390d2c2004-09-10 20:48:21 +0000446 break;
447
448 if (!addrp)
449 {
450 vty_out (vty, "No area address %s for area %s %s", net_title,
451 area->area_tag, VTY_NEWLINE);
Josh Bailey3f045a02012-03-24 08:35:20 -0700452 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +0000453 }
454
jardineb5d44e2003-12-23 08:09:43 +0000455 listnode_delete (area->area_addrs, addrp);
Josh Bailey3f045a02012-03-24 08:35:20 -0700456 XFREE (MTYPE_ISIS_AREA_ADDR, addrp);
457
458 /*
459 * Last area address - reset the SystemID for this router
460 */
461 if (listcount (area->area_addrs) == 0)
462 {
463 memset (isis->sysid, 0, ISIS_SYS_ID_LEN);
464 isis->sysid_set = 0;
465 if (isis->debugs & DEBUG_EVENTS)
466 zlog_debug ("Router has no SystemID");
467 }
hassof390d2c2004-09-10 20:48:21 +0000468
jardineb5d44e2003-12-23 08:09:43 +0000469 return CMD_SUCCESS;
470}
471
jardineb5d44e2003-12-23 08:09:43 +0000472/*
Josh Bailey3f045a02012-03-24 08:35:20 -0700473 * 'show isis interface' command
jardineb5d44e2003-12-23 08:09:43 +0000474 */
475
476int
Josh Bailey3f045a02012-03-24 08:35:20 -0700477show_isis_interface_common (struct vty *vty, const char *ifname, char detail)
jardineb5d44e2003-12-23 08:09:43 +0000478{
hasso3fdb2dd2005-09-28 18:45:54 +0000479 struct listnode *anode, *cnode;
jardineb5d44e2003-12-23 08:09:43 +0000480 struct isis_area *area;
481 struct isis_circuit *circuit;
jardineb5d44e2003-12-23 08:09:43 +0000482
hassof390d2c2004-09-10 20:48:21 +0000483 if (!isis)
484 {
485 vty_out (vty, "IS-IS Routing Process not enabled%s", VTY_NEWLINE);
486 return CMD_SUCCESS;
487 }
jardineb5d44e2003-12-23 08:09:43 +0000488
hasso3fdb2dd2005-09-28 18:45:54 +0000489 for (ALL_LIST_ELEMENTS_RO (isis->area_list, anode, area))
hassof390d2c2004-09-10 20:48:21 +0000490 {
hassof390d2c2004-09-10 20:48:21 +0000491 vty_out (vty, "Area %s:%s", area->area_tag, VTY_NEWLINE);
jardineb5d44e2003-12-23 08:09:43 +0000492
hassof390d2c2004-09-10 20:48:21 +0000493 if (detail == ISIS_UI_LEVEL_BRIEF)
Josh Bailey3f045a02012-03-24 08:35:20 -0700494 vty_out (vty, " Interface CircId State Type Level%s",
495 VTY_NEWLINE);
jardineb5d44e2003-12-23 08:09:43 +0000496
hasso3fdb2dd2005-09-28 18:45:54 +0000497 for (ALL_LIST_ELEMENTS_RO (area->circuit_list, cnode, circuit))
Josh Bailey3f045a02012-03-24 08:35:20 -0700498 if (!ifname)
499 isis_circuit_print_vty (circuit, vty, detail);
500 else if (strcmp(circuit->interface->name, ifname) == 0)
501 isis_circuit_print_vty (circuit, vty, detail);
jardineb5d44e2003-12-23 08:09:43 +0000502 }
hassof390d2c2004-09-10 20:48:21 +0000503
jardineb5d44e2003-12-23 08:09:43 +0000504 return CMD_SUCCESS;
505}
506
Josh Bailey3f045a02012-03-24 08:35:20 -0700507DEFUN (show_isis_interface,
508 show_isis_interface_cmd,
509 "show isis interface",
jardineb5d44e2003-12-23 08:09:43 +0000510 SHOW_STR
Josh Bailey3f045a02012-03-24 08:35:20 -0700511 "ISIS network information\n"
512 "ISIS interface\n")
jardineb5d44e2003-12-23 08:09:43 +0000513{
Josh Bailey3f045a02012-03-24 08:35:20 -0700514 return show_isis_interface_common (vty, NULL, ISIS_UI_LEVEL_BRIEF);
jardineb5d44e2003-12-23 08:09:43 +0000515}
516
Josh Bailey3f045a02012-03-24 08:35:20 -0700517DEFUN (show_isis_interface_detail,
518 show_isis_interface_detail_cmd,
519 "show isis interface detail",
jardineb5d44e2003-12-23 08:09:43 +0000520 SHOW_STR
Josh Bailey3f045a02012-03-24 08:35:20 -0700521 "ISIS network information\n"
522 "ISIS interface\n"
jardineb5d44e2003-12-23 08:09:43 +0000523 "show detailed information\n")
524{
Josh Bailey3f045a02012-03-24 08:35:20 -0700525 return show_isis_interface_common (vty, NULL, ISIS_UI_LEVEL_DETAIL);
jardineb5d44e2003-12-23 08:09:43 +0000526}
527
Josh Bailey3f045a02012-03-24 08:35:20 -0700528DEFUN (show_isis_interface_arg,
529 show_isis_interface_arg_cmd,
530 "show isis interface WORD",
jardineb5d44e2003-12-23 08:09:43 +0000531 SHOW_STR
Josh Bailey3f045a02012-03-24 08:35:20 -0700532 "ISIS network information\n"
533 "ISIS interface\n"
534 "ISIS interface name\n")
535{
536 return show_isis_interface_common (vty, argv[0], ISIS_UI_LEVEL_DETAIL);
537}
538
539/*
540 * 'show isis neighbor' command
541 */
542
543int
544show_isis_neighbor_common (struct vty *vty, const char *id, char detail)
545{
546 struct listnode *anode, *cnode, *node;
547 struct isis_area *area;
548 struct isis_circuit *circuit;
549 struct list *adjdb;
550 struct isis_adjacency *adj;
551 struct isis_dynhn *dynhn;
552 u_char sysid[ISIS_SYS_ID_LEN];
553 int i;
554
555 if (!isis)
556 {
557 vty_out (vty, "IS-IS Routing Process not enabled%s", VTY_NEWLINE);
558 return CMD_SUCCESS;
559 }
560
561 memset (sysid, 0, ISIS_SYS_ID_LEN);
562 if (id)
563 {
564 if (sysid2buff (sysid, id) == 0)
565 {
566 dynhn = dynhn_find_by_name (id);
567 if (dynhn == NULL)
568 {
569 vty_out (vty, "Invalid system id %s%s", id, VTY_NEWLINE);
570 return CMD_SUCCESS;
571 }
572 memcpy (sysid, dynhn->id, ISIS_SYS_ID_LEN);
573 }
574 }
575
576 for (ALL_LIST_ELEMENTS_RO (isis->area_list, anode, area))
577 {
578 vty_out (vty, "Area %s:%s", area->area_tag, VTY_NEWLINE);
579
580 if (detail == ISIS_UI_LEVEL_BRIEF)
581 vty_out (vty, " System Id Interface L State"
582 " Holdtime SNPA%s", VTY_NEWLINE);
583
584 for (ALL_LIST_ELEMENTS_RO (area->circuit_list, cnode, circuit))
585 {
586 if (circuit->circ_type == CIRCUIT_T_BROADCAST)
587 {
588 for (i = 0; i < 2; i++)
589 {
590 adjdb = circuit->u.bc.adjdb[i];
591 if (adjdb && adjdb->count)
592 {
593 for (ALL_LIST_ELEMENTS_RO (adjdb, node, adj))
594 if (!id || !memcmp (adj->sysid, sysid,
595 ISIS_SYS_ID_LEN))
596 isis_adj_print_vty (adj, vty, detail);
597 }
598 }
599 }
600 else if (circuit->circ_type == CIRCUIT_T_P2P &&
601 circuit->u.p2p.neighbor)
602 {
603 adj = circuit->u.p2p.neighbor;
604 if (!id || !memcmp (adj->sysid, sysid, ISIS_SYS_ID_LEN))
605 isis_adj_print_vty (adj, vty, detail);
606 }
607 }
608 }
609
610 return CMD_SUCCESS;
611}
612
613/*
614 * 'clear isis neighbor' command
615 */
616int
617clear_isis_neighbor_common (struct vty *vty, const char *id)
618{
619 struct listnode *anode, *cnode, *cnextnode, *node, *nnode;
620 struct isis_area *area;
621 struct isis_circuit *circuit;
622 struct list *adjdb;
623 struct isis_adjacency *adj;
624 struct isis_dynhn *dynhn;
625 u_char sysid[ISIS_SYS_ID_LEN];
626 int i;
627
628 if (!isis)
629 {
630 vty_out (vty, "IS-IS Routing Process not enabled%s", VTY_NEWLINE);
631 return CMD_SUCCESS;
632 }
633
634 memset (sysid, 0, ISIS_SYS_ID_LEN);
635 if (id)
636 {
637 if (sysid2buff (sysid, id) == 0)
638 {
639 dynhn = dynhn_find_by_name (id);
640 if (dynhn == NULL)
641 {
642 vty_out (vty, "Invalid system id %s%s", id, VTY_NEWLINE);
643 return CMD_SUCCESS;
644 }
645 memcpy (sysid, dynhn->id, ISIS_SYS_ID_LEN);
646 }
647 }
648
649 for (ALL_LIST_ELEMENTS_RO (isis->area_list, anode, area))
650 {
651 for (ALL_LIST_ELEMENTS (area->circuit_list, cnode, cnextnode, circuit))
652 {
653 if (circuit->circ_type == CIRCUIT_T_BROADCAST)
654 {
655 for (i = 0; i < 2; i++)
656 {
657 adjdb = circuit->u.bc.adjdb[i];
658 if (adjdb && adjdb->count)
659 {
660 for (ALL_LIST_ELEMENTS (adjdb, node, nnode, adj))
661 if (!id || !memcmp (adj->sysid, sysid, ISIS_SYS_ID_LEN))
662 isis_adj_state_change (adj, ISIS_ADJ_DOWN,
663 "clear user request");
664 }
665 }
666 }
667 else if (circuit->circ_type == CIRCUIT_T_P2P &&
668 circuit->u.p2p.neighbor)
669 {
670 adj = circuit->u.p2p.neighbor;
671 if (!id || !memcmp (adj->sysid, sysid, ISIS_SYS_ID_LEN))
672 isis_adj_state_change (adj, ISIS_ADJ_DOWN,
673 "clear user request");
674 }
675 }
676 }
677
678 return CMD_SUCCESS;
679}
680
681DEFUN (show_isis_neighbor,
682 show_isis_neighbor_cmd,
683 "show isis neighbor",
684 SHOW_STR
685 "ISIS network information\n"
686 "ISIS neighbor adjacencies\n")
687{
688 return show_isis_neighbor_common (vty, NULL, ISIS_UI_LEVEL_BRIEF);
689}
690
691DEFUN (show_isis_neighbor_detail,
692 show_isis_neighbor_detail_cmd,
693 "show isis neighbor detail",
694 SHOW_STR
695 "ISIS network information\n"
696 "ISIS neighbor adjacencies\n"
jardineb5d44e2003-12-23 08:09:43 +0000697 "show detailed information\n")
Josh Bailey3f045a02012-03-24 08:35:20 -0700698{
699 return show_isis_neighbor_common (vty, NULL, ISIS_UI_LEVEL_DETAIL);
700}
701
702DEFUN (show_isis_neighbor_arg,
703 show_isis_neighbor_arg_cmd,
704 "show isis neighbor WORD",
705 SHOW_STR
706 "ISIS network information\n"
707 "ISIS neighbor adjacencies\n"
708 "System id\n")
709{
710 return show_isis_neighbor_common (vty, argv[0], ISIS_UI_LEVEL_DETAIL);
711}
712
713DEFUN (clear_isis_neighbor,
714 clear_isis_neighbor_cmd,
715 "clear isis neighbor",
716 CLEAR_STR
717 "Reset ISIS network information\n"
718 "Reset ISIS neighbor adjacencies\n")
719{
720 return clear_isis_neighbor_common (vty, NULL);
721}
722
723DEFUN (clear_isis_neighbor_arg,
724 clear_isis_neighbor_arg_cmd,
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -0700725 "clear isis neighbor WORD",
Josh Bailey3f045a02012-03-24 08:35:20 -0700726 CLEAR_STR
727 "ISIS network information\n"
728 "ISIS neighbor adjacencies\n"
729 "System id\n")
730{
731 return clear_isis_neighbor_common (vty, argv[0]);
732}
733
jardineb5d44e2003-12-23 08:09:43 +0000734/*
735 * 'isis debug', 'show debugging'
736 */
jardineb5d44e2003-12-23 08:09:43 +0000737void
738print_debug (struct vty *vty, int flags, int onoff)
739{
740 char onoffs[4];
741 if (onoff)
hassof390d2c2004-09-10 20:48:21 +0000742 strcpy (onoffs, "on");
jardineb5d44e2003-12-23 08:09:43 +0000743 else
hassof390d2c2004-09-10 20:48:21 +0000744 strcpy (onoffs, "off");
jardineb5d44e2003-12-23 08:09:43 +0000745
746 if (flags & DEBUG_ADJ_PACKETS)
hassof390d2c2004-09-10 20:48:21 +0000747 vty_out (vty, "IS-IS Adjacency related packets debugging is %s%s", onoffs,
748 VTY_NEWLINE);
jardineb5d44e2003-12-23 08:09:43 +0000749 if (flags & DEBUG_CHECKSUM_ERRORS)
hassof390d2c2004-09-10 20:48:21 +0000750 vty_out (vty, "IS-IS checksum errors debugging is %s%s", onoffs,
751 VTY_NEWLINE);
jardineb5d44e2003-12-23 08:09:43 +0000752 if (flags & DEBUG_LOCAL_UPDATES)
hassof390d2c2004-09-10 20:48:21 +0000753 vty_out (vty, "IS-IS local updates debugging is %s%s", onoffs,
754 VTY_NEWLINE);
jardineb5d44e2003-12-23 08:09:43 +0000755 if (flags & DEBUG_PROTOCOL_ERRORS)
hassof390d2c2004-09-10 20:48:21 +0000756 vty_out (vty, "IS-IS protocol errors debugging is %s%s", onoffs,
757 VTY_NEWLINE);
jardineb5d44e2003-12-23 08:09:43 +0000758 if (flags & DEBUG_SNP_PACKETS)
hassof390d2c2004-09-10 20:48:21 +0000759 vty_out (vty, "IS-IS CSNP/PSNP packets debugging is %s%s", onoffs,
760 VTY_NEWLINE);
jardineb5d44e2003-12-23 08:09:43 +0000761 if (flags & DEBUG_SPF_EVENTS)
hassof390d2c2004-09-10 20:48:21 +0000762 vty_out (vty, "IS-IS SPF events debugging is %s%s", onoffs, VTY_NEWLINE);
jardineb5d44e2003-12-23 08:09:43 +0000763 if (flags & DEBUG_SPF_STATS)
hassof390d2c2004-09-10 20:48:21 +0000764 vty_out (vty, "IS-IS SPF Timing and Statistics Data debugging is %s%s",
765 onoffs, VTY_NEWLINE);
jardineb5d44e2003-12-23 08:09:43 +0000766 if (flags & DEBUG_SPF_TRIGGERS)
hassof390d2c2004-09-10 20:48:21 +0000767 vty_out (vty, "IS-IS SPF triggering events debugging is %s%s", onoffs,
768 VTY_NEWLINE);
jardineb5d44e2003-12-23 08:09:43 +0000769 if (flags & DEBUG_UPDATE_PACKETS)
hassof390d2c2004-09-10 20:48:21 +0000770 vty_out (vty, "IS-IS Update related packet debugging is %s%s", onoffs,
771 VTY_NEWLINE);
jardineb5d44e2003-12-23 08:09:43 +0000772 if (flags & DEBUG_RTE_EVENTS)
hassof390d2c2004-09-10 20:48:21 +0000773 vty_out (vty, "IS-IS Route related debuggin is %s%s", onoffs,
774 VTY_NEWLINE);
jardineb5d44e2003-12-23 08:09:43 +0000775 if (flags & DEBUG_EVENTS)
hassof390d2c2004-09-10 20:48:21 +0000776 vty_out (vty, "IS-IS Event debugging is %s%s", onoffs, VTY_NEWLINE);
Josh Bailey3f045a02012-03-24 08:35:20 -0700777 if (flags & DEBUG_PACKET_DUMP)
778 vty_out (vty, "IS-IS Packet dump debugging is %s%s", onoffs, VTY_NEWLINE);
Christian Franke80a8f722015-11-12 14:21:47 +0100779 if (flags & DEBUG_LSP_GEN)
780 vty_out (vty, "IS-IS LSP generation debugging is %s%s", onoffs, VTY_NEWLINE);
Christian Franke61010c32015-11-10 18:43:34 +0100781 if (flags & DEBUG_LSP_SCHED)
782 vty_out (vty, "IS-IS LSP scheduling debugging is %s%s", onoffs, VTY_NEWLINE);
jardineb5d44e2003-12-23 08:09:43 +0000783}
784
785DEFUN (show_debugging,
Olivier Dugeon4f593572016-04-19 19:03:05 +0200786 show_debugging_isis_cmd,
787 "show debugging isis",
jardineb5d44e2003-12-23 08:09:43 +0000788 SHOW_STR
789 "State of each debugging option\n")
790{
Olivier Dugeon4f593572016-04-19 19:03:05 +0200791 if (isis->debugs) {
792 vty_out (vty, "IS-IS:%s", VTY_NEWLINE);
793 print_debug (vty, isis->debugs, 1);
794 }
jardineb5d44e2003-12-23 08:09:43 +0000795 return CMD_SUCCESS;
796}
797
jardin9e867fe2003-12-23 08:56:18 +0000798/* Debug node. */
hassof390d2c2004-09-10 20:48:21 +0000799static struct cmd_node debug_node = {
jardin9e867fe2003-12-23 08:56:18 +0000800 DEBUG_NODE,
hassof390d2c2004-09-10 20:48:21 +0000801 "",
802 1
jardin9e867fe2003-12-23 08:56:18 +0000803};
804
805static int
806config_write_debug (struct vty *vty)
807{
808 int write = 0;
809 int flags = isis->debugs;
810
hassof390d2c2004-09-10 20:48:21 +0000811 if (flags & DEBUG_ADJ_PACKETS)
812 {
813 vty_out (vty, "debug isis adj-packets%s", VTY_NEWLINE);
814 write++;
815 }
816 if (flags & DEBUG_CHECKSUM_ERRORS)
817 {
818 vty_out (vty, "debug isis checksum-errors%s", VTY_NEWLINE);
819 write++;
820 }
821 if (flags & DEBUG_LOCAL_UPDATES)
822 {
823 vty_out (vty, "debug isis local-updates%s", VTY_NEWLINE);
824 write++;
825 }
826 if (flags & DEBUG_PROTOCOL_ERRORS)
827 {
828 vty_out (vty, "debug isis protocol-errors%s", VTY_NEWLINE);
829 write++;
830 }
831 if (flags & DEBUG_SNP_PACKETS)
832 {
833 vty_out (vty, "debug isis snp-packets%s", VTY_NEWLINE);
834 write++;
835 }
836 if (flags & DEBUG_SPF_EVENTS)
837 {
838 vty_out (vty, "debug isis spf-events%s", VTY_NEWLINE);
839 write++;
840 }
841 if (flags & DEBUG_SPF_STATS)
842 {
843 vty_out (vty, "debug isis spf-statistics%s", VTY_NEWLINE);
844 write++;
845 }
846 if (flags & DEBUG_SPF_TRIGGERS)
847 {
848 vty_out (vty, "debug isis spf-triggers%s", VTY_NEWLINE);
849 write++;
850 }
851 if (flags & DEBUG_UPDATE_PACKETS)
852 {
853 vty_out (vty, "debug isis update-packets%s", VTY_NEWLINE);
854 write++;
855 }
856 if (flags & DEBUG_RTE_EVENTS)
857 {
858 vty_out (vty, "debug isis route-events%s", VTY_NEWLINE);
859 write++;
860 }
861 if (flags & DEBUG_EVENTS)
862 {
863 vty_out (vty, "debug isis events%s", VTY_NEWLINE);
864 write++;
865 }
Josh Bailey3f045a02012-03-24 08:35:20 -0700866 if (flags & DEBUG_PACKET_DUMP)
867 {
868 vty_out (vty, "debug isis packet-dump%s", VTY_NEWLINE);
869 write++;
870 }
Christian Franke80a8f722015-11-12 14:21:47 +0100871 if (flags & DEBUG_LSP_GEN)
872 {
873 vty_out (vty, "debug isis lsp-gen%s", VTY_NEWLINE);
874 write++;
875 }
Christian Franke61010c32015-11-10 18:43:34 +0100876 if (flags & DEBUG_LSP_SCHED)
877 {
878 vty_out (vty, "debug isis lsp-sched%s", VTY_NEWLINE);
879 write++;
880 }
jardin9e867fe2003-12-23 08:56:18 +0000881
882 return write;
883}
884
jardineb5d44e2003-12-23 08:09:43 +0000885DEFUN (debug_isis_adj,
886 debug_isis_adj_cmd,
887 "debug isis adj-packets",
888 DEBUG_STR
889 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +0000890 "IS-IS Adjacency related packets\n")
jardineb5d44e2003-12-23 08:09:43 +0000891{
892 isis->debugs |= DEBUG_ADJ_PACKETS;
hassof390d2c2004-09-10 20:48:21 +0000893 print_debug (vty, DEBUG_ADJ_PACKETS, 1);
jardineb5d44e2003-12-23 08:09:43 +0000894
895 return CMD_SUCCESS;
896}
897
898DEFUN (no_debug_isis_adj,
899 no_debug_isis_adj_cmd,
900 "no debug isis adj-packets",
901 UNDEBUG_STR
902 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +0000903 "IS-IS Adjacency related packets\n")
jardineb5d44e2003-12-23 08:09:43 +0000904{
jardineb5d44e2003-12-23 08:09:43 +0000905 isis->debugs &= ~DEBUG_ADJ_PACKETS;
906 print_debug (vty, DEBUG_ADJ_PACKETS, 0);
907
908 return CMD_SUCCESS;
909}
910
jardineb5d44e2003-12-23 08:09:43 +0000911DEFUN (debug_isis_csum,
912 debug_isis_csum_cmd,
913 "debug isis checksum-errors",
914 DEBUG_STR
915 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +0000916 "IS-IS LSP checksum errors\n")
jardineb5d44e2003-12-23 08:09:43 +0000917{
918 isis->debugs |= DEBUG_CHECKSUM_ERRORS;
919 print_debug (vty, DEBUG_CHECKSUM_ERRORS, 1);
920
921 return CMD_SUCCESS;
922}
923
924DEFUN (no_debug_isis_csum,
925 no_debug_isis_csum_cmd,
926 "no debug isis checksum-errors",
927 UNDEBUG_STR
928 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +0000929 "IS-IS LSP checksum errors\n")
jardineb5d44e2003-12-23 08:09:43 +0000930{
931 isis->debugs &= ~DEBUG_CHECKSUM_ERRORS;
932 print_debug (vty, DEBUG_CHECKSUM_ERRORS, 0);
hassof390d2c2004-09-10 20:48:21 +0000933
jardineb5d44e2003-12-23 08:09:43 +0000934 return CMD_SUCCESS;
935}
936
937DEFUN (debug_isis_lupd,
938 debug_isis_lupd_cmd,
939 "debug isis local-updates",
940 DEBUG_STR
941 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +0000942 "IS-IS local update packets\n")
jardineb5d44e2003-12-23 08:09:43 +0000943{
944 isis->debugs |= DEBUG_LOCAL_UPDATES;
945 print_debug (vty, DEBUG_LOCAL_UPDATES, 1);
946
947 return CMD_SUCCESS;
948}
949
950DEFUN (no_debug_isis_lupd,
951 no_debug_isis_lupd_cmd,
952 "no debug isis local-updates",
953 UNDEBUG_STR
954 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +0000955 "IS-IS local update packets\n")
jardineb5d44e2003-12-23 08:09:43 +0000956{
957 isis->debugs &= ~DEBUG_LOCAL_UPDATES;
hassof390d2c2004-09-10 20:48:21 +0000958 print_debug (vty, DEBUG_LOCAL_UPDATES, 0);
959
jardineb5d44e2003-12-23 08:09:43 +0000960 return CMD_SUCCESS;
961}
962
963DEFUN (debug_isis_err,
964 debug_isis_err_cmd,
hassof390d2c2004-09-10 20:48:21 +0000965 "debug isis protocol-errors",
jardineb5d44e2003-12-23 08:09:43 +0000966 DEBUG_STR
967 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +0000968 "IS-IS LSP protocol errors\n")
jardineb5d44e2003-12-23 08:09:43 +0000969{
970 isis->debugs |= DEBUG_PROTOCOL_ERRORS;
971 print_debug (vty, DEBUG_PROTOCOL_ERRORS, 1);
972
973 return CMD_SUCCESS;
974}
975
976DEFUN (no_debug_isis_err,
977 no_debug_isis_err_cmd,
978 "no debug isis protocol-errors",
979 UNDEBUG_STR
980 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +0000981 "IS-IS LSP protocol errors\n")
jardineb5d44e2003-12-23 08:09:43 +0000982{
983 isis->debugs &= ~DEBUG_PROTOCOL_ERRORS;
984 print_debug (vty, DEBUG_PROTOCOL_ERRORS, 0);
hassof390d2c2004-09-10 20:48:21 +0000985
jardineb5d44e2003-12-23 08:09:43 +0000986 return CMD_SUCCESS;
987}
988
989DEFUN (debug_isis_snp,
990 debug_isis_snp_cmd,
991 "debug isis snp-packets",
992 DEBUG_STR
993 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +0000994 "IS-IS CSNP/PSNP packets\n")
jardineb5d44e2003-12-23 08:09:43 +0000995{
996 isis->debugs |= DEBUG_SNP_PACKETS;
997 print_debug (vty, DEBUG_SNP_PACKETS, 1);
998
999 return CMD_SUCCESS;
1000}
1001
1002DEFUN (no_debug_isis_snp,
1003 no_debug_isis_snp_cmd,
1004 "no debug isis snp-packets",
1005 UNDEBUG_STR
1006 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +00001007 "IS-IS CSNP/PSNP packets\n")
jardineb5d44e2003-12-23 08:09:43 +00001008{
hassof390d2c2004-09-10 20:48:21 +00001009 isis->debugs &= ~DEBUG_SNP_PACKETS;
jardineb5d44e2003-12-23 08:09:43 +00001010 print_debug (vty, DEBUG_SNP_PACKETS, 0);
hassof390d2c2004-09-10 20:48:21 +00001011
jardineb5d44e2003-12-23 08:09:43 +00001012 return CMD_SUCCESS;
1013}
1014
jardineb5d44e2003-12-23 08:09:43 +00001015DEFUN (debug_isis_upd,
1016 debug_isis_upd_cmd,
1017 "debug isis update-packets",
1018 DEBUG_STR
1019 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +00001020 "IS-IS Update related packets\n")
jardineb5d44e2003-12-23 08:09:43 +00001021{
1022 isis->debugs |= DEBUG_UPDATE_PACKETS;
1023 print_debug (vty, DEBUG_UPDATE_PACKETS, 1);
1024
1025 return CMD_SUCCESS;
1026}
1027
1028DEFUN (no_debug_isis_upd,
1029 no_debug_isis_upd_cmd,
1030 "no debug isis update-packets",
1031 UNDEBUG_STR
1032 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +00001033 "IS-IS Update related packets\n")
jardineb5d44e2003-12-23 08:09:43 +00001034{
1035 isis->debugs &= ~DEBUG_UPDATE_PACKETS;
1036 print_debug (vty, DEBUG_UPDATE_PACKETS, 0);
hassof390d2c2004-09-10 20:48:21 +00001037
jardineb5d44e2003-12-23 08:09:43 +00001038 return CMD_SUCCESS;
1039}
1040
jardineb5d44e2003-12-23 08:09:43 +00001041DEFUN (debug_isis_spfevents,
1042 debug_isis_spfevents_cmd,
1043 "debug isis spf-events",
1044 DEBUG_STR
1045 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +00001046 "IS-IS Shortest Path First Events\n")
jardineb5d44e2003-12-23 08:09:43 +00001047{
1048 isis->debugs |= DEBUG_SPF_EVENTS;
hassof390d2c2004-09-10 20:48:21 +00001049 print_debug (vty, DEBUG_SPF_EVENTS, 1);
jardineb5d44e2003-12-23 08:09:43 +00001050
1051 return CMD_SUCCESS;
1052}
1053
1054DEFUN (no_debug_isis_spfevents,
1055 no_debug_isis_spfevents_cmd,
1056 "no debug isis spf-events",
1057 UNDEBUG_STR
1058 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +00001059 "IS-IS Shortest Path First Events\n")
jardineb5d44e2003-12-23 08:09:43 +00001060{
1061 isis->debugs &= ~DEBUG_SPF_EVENTS;
hassof390d2c2004-09-10 20:48:21 +00001062 print_debug (vty, DEBUG_SPF_EVENTS, 0);
1063
jardineb5d44e2003-12-23 08:09:43 +00001064 return CMD_SUCCESS;
1065}
1066
jardineb5d44e2003-12-23 08:09:43 +00001067DEFUN (debug_isis_spfstats,
1068 debug_isis_spfstats_cmd,
1069 "debug isis spf-statistics ",
1070 DEBUG_STR
1071 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +00001072 "IS-IS SPF Timing and Statistic Data\n")
jardineb5d44e2003-12-23 08:09:43 +00001073{
1074 isis->debugs |= DEBUG_SPF_STATS;
1075 print_debug (vty, DEBUG_SPF_STATS, 1);
1076
1077 return CMD_SUCCESS;
1078}
1079
1080DEFUN (no_debug_isis_spfstats,
1081 no_debug_isis_spfstats_cmd,
1082 "no debug isis spf-statistics",
1083 UNDEBUG_STR
1084 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +00001085 "IS-IS SPF Timing and Statistic Data\n")
jardineb5d44e2003-12-23 08:09:43 +00001086{
1087 isis->debugs &= ~DEBUG_SPF_STATS;
1088 print_debug (vty, DEBUG_SPF_STATS, 0);
hassof390d2c2004-09-10 20:48:21 +00001089
jardineb5d44e2003-12-23 08:09:43 +00001090 return CMD_SUCCESS;
1091}
1092
1093DEFUN (debug_isis_spftrigg,
1094 debug_isis_spftrigg_cmd,
1095 "debug isis spf-triggers",
1096 DEBUG_STR
1097 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +00001098 "IS-IS SPF triggering events\n")
jardineb5d44e2003-12-23 08:09:43 +00001099{
1100 isis->debugs |= DEBUG_SPF_TRIGGERS;
1101 print_debug (vty, DEBUG_SPF_TRIGGERS, 1);
1102
1103 return CMD_SUCCESS;
1104}
1105
1106DEFUN (no_debug_isis_spftrigg,
1107 no_debug_isis_spftrigg_cmd,
1108 "no debug isis spf-triggers",
1109 UNDEBUG_STR
1110 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +00001111 "IS-IS SPF triggering events\n")
jardineb5d44e2003-12-23 08:09:43 +00001112{
1113 isis->debugs &= ~DEBUG_SPF_TRIGGERS;
1114 print_debug (vty, DEBUG_SPF_TRIGGERS, 0);
hassof390d2c2004-09-10 20:48:21 +00001115
jardineb5d44e2003-12-23 08:09:43 +00001116 return CMD_SUCCESS;
1117}
1118
1119DEFUN (debug_isis_rtevents,
1120 debug_isis_rtevents_cmd,
1121 "debug isis route-events",
1122 DEBUG_STR
1123 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +00001124 "IS-IS Route related events\n")
jardineb5d44e2003-12-23 08:09:43 +00001125{
1126 isis->debugs |= DEBUG_RTE_EVENTS;
1127 print_debug (vty, DEBUG_RTE_EVENTS, 1);
1128
1129 return CMD_SUCCESS;
1130}
1131
1132DEFUN (no_debug_isis_rtevents,
1133 no_debug_isis_rtevents_cmd,
1134 "no debug isis route-events",
1135 UNDEBUG_STR
1136 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +00001137 "IS-IS Route related events\n")
jardineb5d44e2003-12-23 08:09:43 +00001138{
1139 isis->debugs &= ~DEBUG_RTE_EVENTS;
1140 print_debug (vty, DEBUG_RTE_EVENTS, 0);
hassof390d2c2004-09-10 20:48:21 +00001141
jardineb5d44e2003-12-23 08:09:43 +00001142 return CMD_SUCCESS;
1143}
1144
1145DEFUN (debug_isis_events,
1146 debug_isis_events_cmd,
1147 "debug isis events",
1148 DEBUG_STR
1149 "IS-IS information\n"
hassof1082d12005-09-19 04:23:34 +00001150 "IS-IS Events\n")
jardineb5d44e2003-12-23 08:09:43 +00001151{
1152 isis->debugs |= DEBUG_EVENTS;
1153 print_debug (vty, DEBUG_EVENTS, 1);
1154
1155 return CMD_SUCCESS;
1156}
1157
1158DEFUN (no_debug_isis_events,
1159 no_debug_isis_events_cmd,
1160 "no debug isis events",
1161 UNDEBUG_STR
1162 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +00001163 "IS-IS Events\n")
jardineb5d44e2003-12-23 08:09:43 +00001164{
1165 isis->debugs &= ~DEBUG_EVENTS;
1166 print_debug (vty, DEBUG_EVENTS, 0);
hassof390d2c2004-09-10 20:48:21 +00001167
jardineb5d44e2003-12-23 08:09:43 +00001168 return CMD_SUCCESS;
1169}
1170
Josh Bailey3f045a02012-03-24 08:35:20 -07001171DEFUN (debug_isis_packet_dump,
1172 debug_isis_packet_dump_cmd,
1173 "debug isis packet-dump",
1174 DEBUG_STR
1175 "IS-IS information\n"
1176 "IS-IS packet dump\n")
1177{
1178 isis->debugs |= DEBUG_PACKET_DUMP;
1179 print_debug (vty, DEBUG_PACKET_DUMP, 1);
1180
1181 return CMD_SUCCESS;
1182}
1183
1184DEFUN (no_debug_isis_packet_dump,
1185 no_debug_isis_packet_dump_cmd,
1186 "no debug isis packet-dump",
1187 UNDEBUG_STR
1188 "IS-IS information\n"
1189 "IS-IS packet dump\n")
1190{
1191 isis->debugs &= ~DEBUG_PACKET_DUMP;
1192 print_debug (vty, DEBUG_PACKET_DUMP, 0);
1193
1194 return CMD_SUCCESS;
1195}
1196
Christian Franke80a8f722015-11-12 14:21:47 +01001197DEFUN (debug_isis_lsp_gen,
1198 debug_isis_lsp_gen_cmd,
1199 "debug isis lsp-gen",
1200 DEBUG_STR
1201 "IS-IS information\n"
1202 "IS-IS generation of own LSPs\n")
1203{
1204 isis->debugs |= DEBUG_LSP_GEN;
1205 print_debug (vty, DEBUG_LSP_GEN, 1);
1206
1207 return CMD_SUCCESS;
1208}
1209
1210DEFUN (no_debug_isis_lsp_gen,
1211 no_debug_isis_lsp_gen_cmd,
1212 "no debug isis lsp-gen",
1213 UNDEBUG_STR
1214 "IS-IS information\n"
1215 "IS-IS generation of own LSPs\n")
1216{
1217 isis->debugs &= ~DEBUG_LSP_GEN;
1218 print_debug (vty, DEBUG_LSP_GEN, 0);
1219
1220 return CMD_SUCCESS;
1221}
1222
Christian Franke61010c32015-11-10 18:43:34 +01001223DEFUN (debug_isis_lsp_sched,
1224 debug_isis_lsp_sched_cmd,
1225 "debug isis lsp-sched",
1226 DEBUG_STR
1227 "IS-IS information\n"
1228 "IS-IS scheduling of LSP generation\n")
1229{
1230 isis->debugs |= DEBUG_LSP_SCHED;
1231 print_debug (vty, DEBUG_LSP_SCHED, 1);
1232
1233 return CMD_SUCCESS;
1234}
1235
1236DEFUN (no_debug_isis_lsp_sched,
1237 no_debug_isis_lsp_sched_cmd,
1238 "no debug isis lsp-gen",
1239 UNDEBUG_STR
1240 "IS-IS information\n"
1241 "IS-IS scheduling of LSP generation\n")
1242{
1243 isis->debugs &= ~DEBUG_LSP_SCHED;
1244 print_debug (vty, DEBUG_LSP_SCHED, 0);
1245
1246 return CMD_SUCCESS;
1247}
1248
jardineb5d44e2003-12-23 08:09:43 +00001249DEFUN (show_hostname,
1250 show_hostname_cmd,
1251 "show isis hostname",
1252 SHOW_STR
1253 "IS-IS information\n"
1254 "IS-IS Dynamic hostname mapping\n")
1255{
1256 dynhn_print_all (vty);
hassof390d2c2004-09-10 20:48:21 +00001257
jardineb5d44e2003-12-23 08:09:43 +00001258 return CMD_SUCCESS;
1259}
1260
Josh Bailey3f045a02012-03-24 08:35:20 -07001261static void
1262vty_out_timestr(struct vty *vty, time_t uptime)
1263{
1264 struct tm *tm;
1265 time_t difftime = time (NULL);
1266 difftime -= uptime;
1267 tm = gmtime (&difftime);
1268
1269#define ONE_DAY_SECOND 60*60*24
1270#define ONE_WEEK_SECOND 60*60*24*7
1271 if (difftime < ONE_DAY_SECOND)
1272 vty_out (vty, "%02d:%02d:%02d",
1273 tm->tm_hour, tm->tm_min, tm->tm_sec);
1274 else if (difftime < ONE_WEEK_SECOND)
1275 vty_out (vty, "%dd%02dh%02dm",
1276 tm->tm_yday, tm->tm_hour, tm->tm_min);
1277 else
1278 vty_out (vty, "%02dw%dd%02dh",
1279 tm->tm_yday/7,
1280 tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
1281 vty_out (vty, " ago");
1282}
1283
1284DEFUN (show_isis_summary,
1285 show_isis_summary_cmd,
1286 "show isis summary",
1287 SHOW_STR "IS-IS information\n" "IS-IS summary\n")
1288{
1289 struct listnode *node, *node2;
1290 struct isis_area *area;
1291 struct isis_spftree *spftree;
1292 int level;
1293
1294 if (isis == NULL)
1295 {
1296 vty_out (vty, "ISIS is not running%s", VTY_NEWLINE);
1297 return CMD_SUCCESS;
1298 }
1299
1300 vty_out (vty, "Process Id : %ld%s", isis->process_id,
1301 VTY_NEWLINE);
1302 if (isis->sysid_set)
1303 vty_out (vty, "System Id : %s%s", sysid_print (isis->sysid),
1304 VTY_NEWLINE);
1305
1306 vty_out (vty, "Up time : ");
1307 vty_out_timestr(vty, isis->uptime);
1308 vty_out (vty, "%s", VTY_NEWLINE);
1309
1310 if (isis->area_list)
1311 vty_out (vty, "Number of areas : %d%s", isis->area_list->count,
1312 VTY_NEWLINE);
1313
1314 for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
1315 {
1316 vty_out (vty, "Area %s:%s", area->area_tag ? area->area_tag : "null",
1317 VTY_NEWLINE);
1318
1319 if (listcount (area->area_addrs) > 0)
1320 {
1321 struct area_addr *area_addr;
1322 for (ALL_LIST_ELEMENTS_RO (area->area_addrs, node2, area_addr))
1323 {
1324 vty_out (vty, " Net: %s%s",
1325 isonet_print (area_addr->area_addr,
1326 area_addr->addr_len + ISIS_SYS_ID_LEN +
1327 1), VTY_NEWLINE);
1328 }
1329 }
1330
1331 for (level = ISIS_LEVEL1; level <= ISIS_LEVELS; level++)
1332 {
1333 if ((area->is_type & level) == 0)
1334 continue;
1335
1336 vty_out (vty, " Level-%d:%s", level, VTY_NEWLINE);
1337 spftree = area->spftree[level - 1];
1338 if (spftree->pending)
1339 vty_out (vty, " IPv4 SPF: (pending)%s", VTY_NEWLINE);
1340 else
1341 vty_out (vty, " IPv4 SPF:%s", VTY_NEWLINE);
1342
1343 vty_out (vty, " minimum interval : %d%s",
1344 area->min_spf_interval[level - 1], VTY_NEWLINE);
1345
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07001346 vty_out (vty, " last run elapsed : ");
1347 vty_out_timestr(vty, spftree->last_run_timestamp);
Josh Bailey3f045a02012-03-24 08:35:20 -07001348 vty_out (vty, "%s", VTY_NEWLINE);
1349
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07001350 vty_out (vty, " last run duration : %u usec%s",
1351 (u_int32_t)spftree->last_run_duration, VTY_NEWLINE);
1352
Josh Bailey3f045a02012-03-24 08:35:20 -07001353 vty_out (vty, " run count : %d%s",
1354 spftree->runcount, VTY_NEWLINE);
1355
1356#ifdef HAVE_IPV6
1357 spftree = area->spftree6[level - 1];
1358 if (spftree->pending)
1359 vty_out (vty, " IPv6 SPF: (pending)%s", VTY_NEWLINE);
1360 else
1361 vty_out (vty, " IPv6 SPF:%s", VTY_NEWLINE);
1362
1363 vty_out (vty, " minimum interval : %d%s",
1364 area->min_spf_interval[level - 1], VTY_NEWLINE);
1365
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07001366 vty_out (vty, " last run elapsed : ");
1367 vty_out_timestr(vty, spftree->last_run_timestamp);
Josh Bailey3f045a02012-03-24 08:35:20 -07001368 vty_out (vty, "%s", VTY_NEWLINE);
1369
David Lamparteref008d22015-03-03 08:48:11 +01001370 vty_out (vty, " last run duration : %llu msec%s",
1371 (unsigned long long)spftree->last_run_duration, VTY_NEWLINE);
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07001372
Josh Bailey3f045a02012-03-24 08:35:20 -07001373 vty_out (vty, " run count : %d%s",
1374 spftree->runcount, VTY_NEWLINE);
1375#endif
1376 }
1377 }
1378 vty_out (vty, "%s", VTY_NEWLINE);
1379
1380 return CMD_SUCCESS;
1381}
1382
1383/*
1384 * This function supports following display options:
1385 * [ show isis database [detail] ]
1386 * [ show isis database <sysid> [detail] ]
1387 * [ show isis database <hostname> [detail] ]
1388 * [ show isis database <sysid>.<pseudo-id> [detail] ]
1389 * [ show isis database <hostname>.<pseudo-id> [detail] ]
1390 * [ show isis database <sysid>.<pseudo-id>-<fragment-number> [detail] ]
1391 * [ show isis database <hostname>.<pseudo-id>-<fragment-number> [detail] ]
1392 * [ show isis database detail <sysid> ]
1393 * [ show isis database detail <hostname> ]
1394 * [ show isis database detail <sysid>.<pseudo-id> ]
1395 * [ show isis database detail <hostname>.<pseudo-id> ]
1396 * [ show isis database detail <sysid>.<pseudo-id>-<fragment-number> ]
1397 * [ show isis database detail <hostname>.<pseudo-id>-<fragment-number> ]
1398 */
1399static int
1400show_isis_database (struct vty *vty, const char *argv, int ui_level)
jardineb5d44e2003-12-23 08:09:43 +00001401{
hasso3fdb2dd2005-09-28 18:45:54 +00001402 struct listnode *node;
jardineb5d44e2003-12-23 08:09:43 +00001403 struct isis_area *area;
Josh Bailey3f045a02012-03-24 08:35:20 -07001404 struct isis_lsp *lsp;
1405 struct isis_dynhn *dynhn;
1406 const char *pos = argv;
1407 u_char lspid[ISIS_SYS_ID_LEN+2];
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07001408 char sysid[255];
Josh Bailey3f045a02012-03-24 08:35:20 -07001409 u_char number[3];
hassof390d2c2004-09-10 20:48:21 +00001410 int level, lsp_count;
jardineb5d44e2003-12-23 08:09:43 +00001411
1412 if (isis->area_list->count == 0)
1413 return CMD_SUCCESS;
jardineb5d44e2003-12-23 08:09:43 +00001414
Josh Bailey3f045a02012-03-24 08:35:20 -07001415 memset (&lspid, 0, ISIS_SYS_ID_LEN);
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07001416 memset (&sysid, 0, 255);
Josh Bailey3f045a02012-03-24 08:35:20 -07001417
1418 /*
1419 * extract fragment and pseudo id from the string argv
1420 * in the forms:
1421 * (a) <systemid/hostname>.<pseudo-id>-<framenent> or
1422 * (b) <systemid/hostname>.<pseudo-id> or
1423 * (c) <systemid/hostname> or
1424 * Where systemid is in the form:
1425 * xxxx.xxxx.xxxx
1426 */
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07001427 if (argv)
1428 strncpy (sysid, argv, 254);
Josh Bailey3f045a02012-03-24 08:35:20 -07001429 if (argv && strlen (argv) > 3)
1430 {
1431 pos = argv + strlen (argv) - 3;
1432 if (strncmp (pos, "-", 1) == 0)
1433 {
1434 memcpy (number, ++pos, 2);
1435 lspid[ISIS_SYS_ID_LEN+1] = (u_char) strtol ((char *)number, NULL, 16);
1436 pos -= 4;
1437 if (strncmp (pos, ".", 1) != 0)
1438 return CMD_ERR_AMBIGUOUS;
1439 }
1440 if (strncmp (pos, ".", 1) == 0)
1441 {
1442 memcpy (number, ++pos, 2);
1443 lspid[ISIS_SYS_ID_LEN] = (u_char) strtol ((char *)number, NULL, 16);
1444 sysid[pos - argv - 1] = '\0';
1445 }
1446 }
1447
hasso3fdb2dd2005-09-28 18:45:54 +00001448 for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
hassof390d2c2004-09-10 20:48:21 +00001449 {
hassof390d2c2004-09-10 20:48:21 +00001450 vty_out (vty, "Area %s:%s", area->area_tag ? area->area_tag : "null",
Josh Bailey3f045a02012-03-24 08:35:20 -07001451 VTY_NEWLINE);
1452
hassof390d2c2004-09-10 20:48:21 +00001453 for (level = 0; level < ISIS_LEVELS; level++)
Josh Bailey3f045a02012-03-24 08:35:20 -07001454 {
1455 if (area->lspdb[level] && dict_count (area->lspdb[level]) > 0)
1456 {
1457 lsp = NULL;
1458 if (argv != NULL)
1459 {
1460 /*
1461 * Try to find the lsp-id if the argv string is in
1462 * the form hostname.<pseudo-id>-<fragment>
1463 */
1464 if (sysid2buff (lspid, sysid))
1465 {
1466 lsp = lsp_search (lspid, area->lspdb[level]);
1467 }
1468 else if ((dynhn = dynhn_find_by_name (sysid)))
1469 {
1470 memcpy (lspid, dynhn->id, ISIS_SYS_ID_LEN);
1471 lsp = lsp_search (lspid, area->lspdb[level]);
1472 }
1473 else if (strncmp(unix_hostname (), sysid, 15) == 0)
1474 {
1475 memcpy (lspid, isis->sysid, ISIS_SYS_ID_LEN);
1476 lsp = lsp_search (lspid, area->lspdb[level]);
1477 }
1478 }
jardineb5d44e2003-12-23 08:09:43 +00001479
Josh Bailey3f045a02012-03-24 08:35:20 -07001480 if (lsp != NULL || argv == NULL)
1481 {
1482 vty_out (vty, "IS-IS Level-%d link-state database:%s",
1483 level + 1, VTY_NEWLINE);
hassof390d2c2004-09-10 20:48:21 +00001484
Josh Bailey3f045a02012-03-24 08:35:20 -07001485 /* print the title in all cases */
1486 vty_out (vty, "LSP ID PduLen "
1487 "SeqNumber Chksum Holdtime ATT/P/OL%s",
1488 VTY_NEWLINE);
1489 }
1490
1491 if (lsp)
1492 {
1493 if (ui_level == ISIS_UI_LEVEL_DETAIL)
1494 lsp_print_detail (lsp, vty, area->dynhostname);
1495 else
1496 lsp_print (lsp, vty, area->dynhostname);
1497 }
1498 else if (argv == NULL)
1499 {
1500 lsp_count = lsp_print_all (vty, area->lspdb[level],
1501 ui_level,
1502 area->dynhostname);
1503
1504 vty_out (vty, " %u LSPs%s%s",
1505 lsp_count, VTY_NEWLINE, VTY_NEWLINE);
1506 }
1507 }
1508 }
jardineb5d44e2003-12-23 08:09:43 +00001509 }
jardineb5d44e2003-12-23 08:09:43 +00001510
1511 return CMD_SUCCESS;
1512}
1513
Josh Bailey3f045a02012-03-24 08:35:20 -07001514DEFUN (show_database_brief,
1515 show_database_cmd,
1516 "show isis database",
1517 SHOW_STR
1518 "IS-IS information\n"
1519 "IS-IS link state database\n")
1520{
1521 return show_isis_database (vty, NULL, ISIS_UI_LEVEL_BRIEF);
1522}
1523
1524DEFUN (show_database_lsp_brief,
1525 show_database_arg_cmd,
1526 "show isis database WORD",
1527 SHOW_STR
1528 "IS-IS information\n"
1529 "IS-IS link state database\n"
1530 "LSP ID\n")
1531{
1532 return show_isis_database (vty, argv[0], ISIS_UI_LEVEL_BRIEF);
1533}
1534
1535DEFUN (show_database_lsp_detail,
1536 show_database_arg_detail_cmd,
1537 "show isis database WORD detail",
1538 SHOW_STR
1539 "IS-IS information\n"
1540 "IS-IS link state database\n"
1541 "LSP ID\n"
1542 "Detailed information\n")
1543{
1544 return show_isis_database (vty, argv[0], ISIS_UI_LEVEL_DETAIL);
1545}
1546
jardineb5d44e2003-12-23 08:09:43 +00001547DEFUN (show_database_detail,
1548 show_database_detail_cmd,
1549 "show isis database detail",
1550 SHOW_STR
1551 "IS-IS information\n"
1552 "IS-IS link state database\n")
1553{
Josh Bailey3f045a02012-03-24 08:35:20 -07001554 return show_isis_database (vty, NULL, ISIS_UI_LEVEL_DETAIL);
1555}
jardineb5d44e2003-12-23 08:09:43 +00001556
Josh Bailey3f045a02012-03-24 08:35:20 -07001557DEFUN (show_database_detail_lsp,
1558 show_database_detail_arg_cmd,
1559 "show isis database detail WORD",
1560 SHOW_STR
1561 "IS-IS information\n"
1562 "IS-IS link state database\n"
1563 "Detailed information\n"
1564 "LSP ID\n")
1565{
1566 return show_isis_database (vty, argv[0], ISIS_UI_LEVEL_DETAIL);
jardineb5d44e2003-12-23 08:09:43 +00001567}
1568
1569/*
1570 * 'router isis' command
1571 */
1572DEFUN (router_isis,
1573 router_isis_cmd,
1574 "router isis WORD",
hassof390d2c2004-09-10 20:48:21 +00001575 ROUTER_STR
jardineb5d44e2003-12-23 08:09:43 +00001576 "ISO IS-IS\n"
1577 "ISO Routing area tag")
1578{
jardineb5d44e2003-12-23 08:09:43 +00001579 return isis_area_get (vty, argv[0]);
jardineb5d44e2003-12-23 08:09:43 +00001580}
1581
1582/*
1583 *'no router isis' command
1584 */
1585DEFUN (no_router_isis,
1586 no_router_isis_cmd,
1587 "no router isis WORD",
hassof390d2c2004-09-10 20:48:21 +00001588 "no\n" ROUTER_STR "ISO IS-IS\n" "ISO Routing area tag")
jardineb5d44e2003-12-23 08:09:43 +00001589{
1590 return isis_area_destroy (vty, argv[0]);
1591}
1592
1593/*
1594 * 'net' command
1595 */
1596DEFUN (net,
1597 net_cmd,
1598 "net WORD",
1599 "A Network Entity Title for this process (OSI only)\n"
hassof390d2c2004-09-10 20:48:21 +00001600 "XX.XXXX. ... .XXX.XX Network entity title (NET)\n")
jardineb5d44e2003-12-23 08:09:43 +00001601{
Paul Jakma41b36e92006-12-08 01:09:50 +00001602 return area_net_title (vty, argv[0]);
jardineb5d44e2003-12-23 08:09:43 +00001603}
1604
jardineb5d44e2003-12-23 08:09:43 +00001605/*
1606 * 'no net' command
1607 */
1608DEFUN (no_net,
1609 no_net_cmd,
1610 "no net WORD",
1611 NO_STR
1612 "A Network Entity Title for this process (OSI only)\n"
hassof390d2c2004-09-10 20:48:21 +00001613 "XX.XXXX. ... .XXX.XX Network entity title (NET)\n")
jardineb5d44e2003-12-23 08:09:43 +00001614{
Paul Jakma41b36e92006-12-08 01:09:50 +00001615 return area_clear_net_title (vty, argv[0]);
jardineb5d44e2003-12-23 08:09:43 +00001616}
1617
Christian Frankef1fc1db2015-11-10 18:43:31 +01001618static
1619int area_set_lsp_mtu(struct vty *vty, struct isis_area *area, unsigned int lsp_mtu)
1620{
1621 struct isis_circuit *circuit;
1622 struct listnode *node;
1623
1624 for (ALL_LIST_ELEMENTS_RO(area->circuit_list, node, circuit))
1625 {
Christian Frankee7207092016-04-03 12:46:28 -03001626 if(circuit->state != C_STATE_INIT && circuit->state != C_STATE_UP)
1627 continue;
Christian Frankef1fc1db2015-11-10 18:43:31 +01001628 if(lsp_mtu > isis_circuit_pdu_size(circuit))
1629 {
1630 vty_out(vty, "ISIS area contains circuit %s, which has a maximum PDU size of %zu.%s",
1631 circuit->interface->name, isis_circuit_pdu_size(circuit),
1632 VTY_NEWLINE);
1633 return CMD_ERR_AMBIGUOUS;
1634 }
1635 }
1636
1637 area->lsp_mtu = lsp_mtu;
1638 lsp_regenerate_schedule(area, IS_LEVEL_1_AND_2, 1);
1639
1640 return CMD_SUCCESS;
1641}
1642
1643DEFUN (area_lsp_mtu,
1644 area_lsp_mtu_cmd,
1645 "lsp-mtu <128-4352>",
1646 "Configure the maximum size of generated LSPs\n"
1647 "Maximum size of generated LSPs\n")
1648{
1649 struct isis_area *area;
1650
1651 area = vty->index;
1652 if (!area)
1653 {
1654 vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE);
1655 return CMD_ERR_NO_MATCH;
1656 }
1657
1658 unsigned int lsp_mtu;
1659
1660 VTY_GET_INTEGER_RANGE("lsp-mtu", lsp_mtu, argv[0], 128, 4352);
1661
1662 return area_set_lsp_mtu(vty, area, lsp_mtu);
1663}
1664
1665DEFUN(no_area_lsp_mtu,
1666 no_area_lsp_mtu_cmd,
1667 "no lsp-mtu",
1668 NO_STR
1669 "Configure the maximum size of generated LSPs\n")
1670{
1671 struct isis_area *area;
1672
1673 area = vty->index;
1674 if (!area)
1675 {
1676 vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE);
1677 return CMD_ERR_NO_MATCH;
1678 }
1679
1680 return area_set_lsp_mtu(vty, area, DEFAULT_LSP_MTU);
1681}
1682
1683ALIAS(no_area_lsp_mtu,
1684 no_area_lsp_mtu_arg_cmd,
1685 "no lsp-mtu <128-4352>",
1686 NO_STR
1687 "Configure the maximum size of generated LSPs\n"
1688 "Maximum size of generated LSPs\n");
1689
Josh Bailey3f045a02012-03-24 08:35:20 -07001690DEFUN (area_passwd_md5,
1691 area_passwd_md5_cmd,
1692 "area-password md5 WORD",
jardineb5d44e2003-12-23 08:09:43 +00001693 "Configure the authentication password for an area\n"
Josh Bailey3f045a02012-03-24 08:35:20 -07001694 "Authentication type\n"
hassof390d2c2004-09-10 20:48:21 +00001695 "Area password\n")
jardineb5d44e2003-12-23 08:09:43 +00001696{
1697 struct isis_area *area;
1698 int len;
1699
1700 area = vty->index;
1701
hassof390d2c2004-09-10 20:48:21 +00001702 if (!area)
1703 {
Josh Bailey3f045a02012-03-24 08:35:20 -07001704 vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
1705 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00001706 }
1707
jardineb5d44e2003-12-23 08:09:43 +00001708 len = strlen (argv[0]);
hassof390d2c2004-09-10 20:48:21 +00001709 if (len > 254)
1710 {
1711 vty_out (vty, "Too long area password (>254)%s", VTY_NEWLINE);
Josh Bailey3f045a02012-03-24 08:35:20 -07001712 return CMD_ERR_AMBIGUOUS;
hassof390d2c2004-09-10 20:48:21 +00001713 }
Josh Bailey3f045a02012-03-24 08:35:20 -07001714
1715 area->area_passwd.len = (u_char) len;
1716 area->area_passwd.type = ISIS_PASSWD_TYPE_HMAC_MD5;
1717 strncpy ((char *)area->area_passwd.passwd, argv[0], 255);
1718
1719 if (argc > 1)
1720 {
1721 SET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND);
1722 if (strncmp(argv[1], "v", 1) == 0)
1723 SET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV);
1724 else
1725 UNSET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV);
1726 }
1727 else
1728 {
1729 UNSET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND);
1730 UNSET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV);
1731 }
1732 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
1733
1734 return CMD_SUCCESS;
1735}
1736
1737ALIAS (area_passwd_md5,
1738 area_passwd_md5_snpauth_cmd,
1739 "area-password md5 WORD authenticate snp (send-only|validate)",
1740 "Configure the authentication password for an area\n"
1741 "Authentication type\n"
1742 "Area password\n"
1743 "Authentication\n"
1744 "SNP PDUs\n"
1745 "Send but do not check PDUs on receiving\n"
David Lamparterb7d50212015-03-03 08:53:18 +01001746 "Send and check PDUs on receiving\n")
Josh Bailey3f045a02012-03-24 08:35:20 -07001747
1748DEFUN (area_passwd_clear,
1749 area_passwd_clear_cmd,
1750 "area-password clear WORD",
1751 "Configure the authentication password for an area\n"
1752 "Authentication type\n"
1753 "Area password\n")
1754{
1755 struct isis_area *area;
1756 int len;
1757
1758 area = vty->index;
1759
1760 if (!area)
1761 {
1762 vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
1763 return CMD_ERR_NO_MATCH;
1764 }
1765
1766 len = strlen (argv[0]);
1767 if (len > 254)
1768 {
1769 vty_out (vty, "Too long area password (>254)%s", VTY_NEWLINE);
1770 return CMD_ERR_AMBIGUOUS;
1771 }
1772
hassof390d2c2004-09-10 20:48:21 +00001773 area->area_passwd.len = (u_char) len;
jardineb5d44e2003-12-23 08:09:43 +00001774 area->area_passwd.type = ISIS_PASSWD_TYPE_CLEARTXT;
hassof7c43dc2004-09-26 16:24:14 +00001775 strncpy ((char *)area->area_passwd.passwd, argv[0], 255);
hassof390d2c2004-09-10 20:48:21 +00001776
hasso1cbc5622005-01-01 10:29:51 +00001777 if (argc > 1)
1778 {
1779 SET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND);
1780 if (strncmp(argv[1], "v", 1) == 0)
1781 SET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV);
1782 else
1783 UNSET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV);
1784 }
1785 else
1786 {
1787 UNSET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND);
1788 UNSET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV);
1789 }
Josh Bailey3f045a02012-03-24 08:35:20 -07001790 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
hasso1cbc5622005-01-01 10:29:51 +00001791
jardineb5d44e2003-12-23 08:09:43 +00001792 return CMD_SUCCESS;
1793}
1794
Josh Bailey3f045a02012-03-24 08:35:20 -07001795ALIAS (area_passwd_clear,
1796 area_passwd_clear_snpauth_cmd,
1797 "area-password clear WORD authenticate snp (send-only|validate)",
hasso1cbc5622005-01-01 10:29:51 +00001798 "Configure the authentication password for an area\n"
Josh Bailey3f045a02012-03-24 08:35:20 -07001799 "Authentication type\n"
hasso1cbc5622005-01-01 10:29:51 +00001800 "Area password\n"
1801 "Authentication\n"
1802 "SNP PDUs\n"
1803 "Send but do not check PDUs on receiving\n"
David Lamparterb7d50212015-03-03 08:53:18 +01001804 "Send and check PDUs on receiving\n")
hasso1cbc5622005-01-01 10:29:51 +00001805
jardineb5d44e2003-12-23 08:09:43 +00001806DEFUN (no_area_passwd,
1807 no_area_passwd_cmd,
1808 "no area-password",
1809 NO_STR
1810 "Configure the authentication password for an area\n")
1811{
1812 struct isis_area *area;
hassof390d2c2004-09-10 20:48:21 +00001813
jardineb5d44e2003-12-23 08:09:43 +00001814 area = vty->index;
1815
hassof390d2c2004-09-10 20:48:21 +00001816 if (!area)
1817 {
Josh Bailey3f045a02012-03-24 08:35:20 -07001818 vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
1819 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00001820 }
1821
jardineb5d44e2003-12-23 08:09:43 +00001822 memset (&area->area_passwd, 0, sizeof (struct isis_passwd));
Josh Bailey3f045a02012-03-24 08:35:20 -07001823 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
jardineb5d44e2003-12-23 08:09:43 +00001824
1825 return CMD_SUCCESS;
1826}
1827
Josh Bailey3f045a02012-03-24 08:35:20 -07001828DEFUN (domain_passwd_md5,
1829 domain_passwd_md5_cmd,
1830 "domain-password md5 WORD",
jardineb5d44e2003-12-23 08:09:43 +00001831 "Set the authentication password for a routing domain\n"
Josh Bailey3f045a02012-03-24 08:35:20 -07001832 "Authentication type\n"
hassof390d2c2004-09-10 20:48:21 +00001833 "Routing domain password\n")
jardineb5d44e2003-12-23 08:09:43 +00001834{
1835 struct isis_area *area;
1836 int len;
1837
1838 area = vty->index;
1839
hassof390d2c2004-09-10 20:48:21 +00001840 if (!area)
1841 {
Josh Bailey3f045a02012-03-24 08:35:20 -07001842 vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
1843 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00001844 }
1845
jardineb5d44e2003-12-23 08:09:43 +00001846 len = strlen (argv[0]);
hassof390d2c2004-09-10 20:48:21 +00001847 if (len > 254)
1848 {
1849 vty_out (vty, "Too long area password (>254)%s", VTY_NEWLINE);
Josh Bailey3f045a02012-03-24 08:35:20 -07001850 return CMD_ERR_AMBIGUOUS;
hassof390d2c2004-09-10 20:48:21 +00001851 }
Josh Bailey3f045a02012-03-24 08:35:20 -07001852
1853 area->domain_passwd.len = (u_char) len;
1854 area->domain_passwd.type = ISIS_PASSWD_TYPE_HMAC_MD5;
1855 strncpy ((char *)area->domain_passwd.passwd, argv[0], 255);
1856
1857 if (argc > 1)
1858 {
1859 SET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND);
1860 if (strncmp(argv[1], "v", 1) == 0)
1861 SET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV);
1862 else
1863 UNSET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV);
1864 }
1865 else
1866 {
1867 UNSET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND);
1868 UNSET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV);
1869 }
1870 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
1871
1872 return CMD_SUCCESS;
1873}
1874
1875ALIAS (domain_passwd_md5,
1876 domain_passwd_md5_snpauth_cmd,
1877 "domain-password md5 WORD authenticate snp (send-only|validate)",
1878 "Set the authentication password for a routing domain\n"
1879 "Authentication type\n"
1880 "Routing domain password\n"
1881 "Authentication\n"
1882 "SNP PDUs\n"
1883 "Send but do not check PDUs on receiving\n"
David Lamparterb7d50212015-03-03 08:53:18 +01001884 "Send and check PDUs on receiving\n")
Josh Bailey3f045a02012-03-24 08:35:20 -07001885
1886DEFUN (domain_passwd_clear,
1887 domain_passwd_clear_cmd,
1888 "domain-password clear WORD",
1889 "Set the authentication password for a routing domain\n"
1890 "Authentication type\n"
1891 "Routing domain password\n")
1892{
1893 struct isis_area *area;
1894 int len;
1895
1896 area = vty->index;
1897
1898 if (!area)
1899 {
1900 vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
1901 return CMD_ERR_NO_MATCH;
1902 }
1903
1904 len = strlen (argv[0]);
1905 if (len > 254)
1906 {
1907 vty_out (vty, "Too long area password (>254)%s", VTY_NEWLINE);
1908 return CMD_ERR_AMBIGUOUS;
1909 }
1910
hassof390d2c2004-09-10 20:48:21 +00001911 area->domain_passwd.len = (u_char) len;
jardineb5d44e2003-12-23 08:09:43 +00001912 area->domain_passwd.type = ISIS_PASSWD_TYPE_CLEARTXT;
hassof7c43dc2004-09-26 16:24:14 +00001913 strncpy ((char *)area->domain_passwd.passwd, argv[0], 255);
hassof390d2c2004-09-10 20:48:21 +00001914
hasso1cbc5622005-01-01 10:29:51 +00001915 if (argc > 1)
1916 {
1917 SET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND);
1918 if (strncmp(argv[1], "v", 1) == 0)
1919 SET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV);
1920 else
1921 UNSET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV);
1922 }
1923 else
1924 {
1925 UNSET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND);
1926 UNSET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV);
1927 }
Josh Bailey3f045a02012-03-24 08:35:20 -07001928 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
hasso1cbc5622005-01-01 10:29:51 +00001929
jardineb5d44e2003-12-23 08:09:43 +00001930 return CMD_SUCCESS;
1931}
1932
Josh Bailey3f045a02012-03-24 08:35:20 -07001933ALIAS (domain_passwd_clear,
1934 domain_passwd_clear_snpauth_cmd,
1935 "domain-password clear WORD authenticate snp (send-only|validate)",
hasso1cbc5622005-01-01 10:29:51 +00001936 "Set the authentication password for a routing domain\n"
Josh Bailey3f045a02012-03-24 08:35:20 -07001937 "Authentication type\n"
hasso1cbc5622005-01-01 10:29:51 +00001938 "Routing domain password\n"
1939 "Authentication\n"
1940 "SNP PDUs\n"
1941 "Send but do not check PDUs on receiving\n"
David Lamparterb7d50212015-03-03 08:53:18 +01001942 "Send and check PDUs on receiving\n")
hasso1cbc5622005-01-01 10:29:51 +00001943
jardineb5d44e2003-12-23 08:09:43 +00001944DEFUN (no_domain_passwd,
1945 no_domain_passwd_cmd,
Josh Bailey3f045a02012-03-24 08:35:20 -07001946 "no domain-password",
jardineb5d44e2003-12-23 08:09:43 +00001947 NO_STR
1948 "Set the authentication password for a routing domain\n")
1949{
1950 struct isis_area *area;
hassof390d2c2004-09-10 20:48:21 +00001951
jardineb5d44e2003-12-23 08:09:43 +00001952 area = vty->index;
1953
hassof390d2c2004-09-10 20:48:21 +00001954 if (!area)
1955 {
Josh Bailey3f045a02012-03-24 08:35:20 -07001956 vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
1957 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00001958 }
1959
jardineb5d44e2003-12-23 08:09:43 +00001960 memset (&area->domain_passwd, 0, sizeof (struct isis_passwd));
Josh Bailey3f045a02012-03-24 08:35:20 -07001961 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
hassof390d2c2004-09-10 20:48:21 +00001962
jardineb5d44e2003-12-23 08:09:43 +00001963 return CMD_SUCCESS;
1964}
1965
1966DEFUN (is_type,
1967 is_type_cmd,
1968 "is-type (level-1|level-1-2|level-2-only)",
1969 "IS Level for this routing process (OSI only)\n"
1970 "Act as a station router only\n"
1971 "Act as both a station router and an area router\n"
1972 "Act as an area router only\n")
1973{
1974 struct isis_area *area;
1975 int type;
1976
1977 area = vty->index;
1978
hassof390d2c2004-09-10 20:48:21 +00001979 if (!area)
1980 {
Josh Bailey3f045a02012-03-24 08:35:20 -07001981 vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
1982 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00001983 }
jardineb5d44e2003-12-23 08:09:43 +00001984
Paul Jakma41b36e92006-12-08 01:09:50 +00001985 type = string2circuit_t (argv[0]);
hassof390d2c2004-09-10 20:48:21 +00001986 if (!type)
1987 {
1988 vty_out (vty, "Unknown IS level %s", VTY_NEWLINE);
1989 return CMD_SUCCESS;
1990 }
jardineb5d44e2003-12-23 08:09:43 +00001991
1992 isis_event_system_type_change (area, type);
hassof390d2c2004-09-10 20:48:21 +00001993
jardineb5d44e2003-12-23 08:09:43 +00001994 return CMD_SUCCESS;
1995}
1996
1997DEFUN (no_is_type,
1998 no_is_type_cmd,
1999 "no is-type (level-1|level-1-2|level-2-only)",
2000 NO_STR
2001 "IS Level for this routing process (OSI only)\n"
2002 "Act as a station router only\n"
2003 "Act as both a station router and an area router\n"
2004 "Act as an area router only\n")
2005{
jardineb5d44e2003-12-23 08:09:43 +00002006 struct isis_area *area;
2007 int type;
2008
2009 area = vty->index;
2010 assert (area);
hassof390d2c2004-09-10 20:48:21 +00002011
jardineb5d44e2003-12-23 08:09:43 +00002012 /*
Josh Bailey3f045a02012-03-24 08:35:20 -07002013 * Put the is-type back to defaults:
2014 * - level-1-2 on first area
2015 * - level-1 for the rest
jardineb5d44e2003-12-23 08:09:43 +00002016 */
paul1eb8ef22005-04-07 07:30:20 +00002017 if (listgetdata (listhead (isis->area_list)) == area)
jardineb5d44e2003-12-23 08:09:43 +00002018 type = IS_LEVEL_1_AND_2;
2019 else
2020 type = IS_LEVEL_1;
2021
2022 isis_event_system_type_change (area, type);
2023
2024 return CMD_SUCCESS;
2025}
2026
Josh Bailey3f045a02012-03-24 08:35:20 -07002027static int
2028set_lsp_gen_interval (struct vty *vty, struct isis_area *area,
2029 uint16_t interval, int level)
2030{
2031 int lvl;
2032
2033 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl)
2034 {
2035 if (!(lvl & level))
2036 continue;
2037
2038 if (interval >= area->lsp_refresh[lvl-1])
2039 {
2040 vty_out (vty, "LSP gen interval %us must be less than "
2041 "the LSP refresh interval %us%s",
2042 interval, area->lsp_refresh[lvl-1], VTY_NEWLINE);
2043 return CMD_ERR_AMBIGUOUS;
2044 }
2045 }
2046
2047 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl)
2048 {
2049 if (!(lvl & level))
2050 continue;
2051 area->lsp_gen_interval[lvl-1] = interval;
2052 }
2053
2054 return CMD_SUCCESS;
2055}
2056
jardineb5d44e2003-12-23 08:09:43 +00002057DEFUN (lsp_gen_interval,
2058 lsp_gen_interval_cmd,
2059 "lsp-gen-interval <1-120>",
2060 "Minimum interval between regenerating same LSP\n"
2061 "Minimum interval in seconds\n")
2062{
2063 struct isis_area *area;
2064 uint16_t interval;
Josh Bailey3f045a02012-03-24 08:35:20 -07002065 int level;
jardineb5d44e2003-12-23 08:09:43 +00002066
2067 area = vty->index;
jardineb5d44e2003-12-23 08:09:43 +00002068 interval = atoi (argv[0]);
Josh Bailey3f045a02012-03-24 08:35:20 -07002069 level = IS_LEVEL_1 | IS_LEVEL_2;
2070 return set_lsp_gen_interval (vty, area, interval, level);
jardineb5d44e2003-12-23 08:09:43 +00002071}
2072
2073DEFUN (no_lsp_gen_interval,
2074 no_lsp_gen_interval_cmd,
2075 "no lsp-gen-interval",
2076 NO_STR
hassof390d2c2004-09-10 20:48:21 +00002077 "Minimum interval between regenerating same LSP\n")
jardineb5d44e2003-12-23 08:09:43 +00002078{
2079 struct isis_area *area;
Josh Bailey3f045a02012-03-24 08:35:20 -07002080 uint16_t interval;
2081 int level;
jardineb5d44e2003-12-23 08:09:43 +00002082
2083 area = vty->index;
Josh Bailey3f045a02012-03-24 08:35:20 -07002084 interval = DEFAULT_MIN_LSP_GEN_INTERVAL;
2085 level = IS_LEVEL_1 | IS_LEVEL_2;
2086 return set_lsp_gen_interval (vty, area, interval, level);
jardineb5d44e2003-12-23 08:09:43 +00002087}
2088
2089ALIAS (no_lsp_gen_interval,
2090 no_lsp_gen_interval_arg_cmd,
2091 "no lsp-gen-interval <1-120>",
2092 NO_STR
2093 "Minimum interval between regenerating same LSP\n"
hassof390d2c2004-09-10 20:48:21 +00002094 "Minimum interval in seconds\n")
jardineb5d44e2003-12-23 08:09:43 +00002095
2096DEFUN (lsp_gen_interval_l1,
2097 lsp_gen_interval_l1_cmd,
2098 "lsp-gen-interval level-1 <1-120>",
2099 "Minimum interval between regenerating same LSP\n"
2100 "Set interval for level 1 only\n"
hassof390d2c2004-09-10 20:48:21 +00002101 "Minimum interval in seconds\n")
jardineb5d44e2003-12-23 08:09:43 +00002102{
2103 struct isis_area *area;
2104 uint16_t interval;
Josh Bailey3f045a02012-03-24 08:35:20 -07002105 int level;
jardineb5d44e2003-12-23 08:09:43 +00002106
2107 area = vty->index;
jardineb5d44e2003-12-23 08:09:43 +00002108 interval = atoi (argv[0]);
Josh Bailey3f045a02012-03-24 08:35:20 -07002109 level = IS_LEVEL_1;
2110 return set_lsp_gen_interval (vty, area, interval, level);
jardineb5d44e2003-12-23 08:09:43 +00002111}
2112
2113DEFUN (no_lsp_gen_interval_l1,
2114 no_lsp_gen_interval_l1_cmd,
2115 "no lsp-gen-interval level-1",
2116 NO_STR
2117 "Minimum interval between regenerating same LSP\n"
hassof390d2c2004-09-10 20:48:21 +00002118 "Set interval for level 1 only\n")
jardineb5d44e2003-12-23 08:09:43 +00002119{
2120 struct isis_area *area;
Josh Bailey3f045a02012-03-24 08:35:20 -07002121 uint16_t interval;
2122 int level;
jardineb5d44e2003-12-23 08:09:43 +00002123
2124 area = vty->index;
Josh Bailey3f045a02012-03-24 08:35:20 -07002125 interval = DEFAULT_MIN_LSP_GEN_INTERVAL;
2126 level = IS_LEVEL_1;
2127 return set_lsp_gen_interval (vty, area, interval, level);
jardineb5d44e2003-12-23 08:09:43 +00002128}
2129
2130ALIAS (no_lsp_gen_interval_l1,
2131 no_lsp_gen_interval_l1_arg_cmd,
2132 "no lsp-gen-interval level-1 <1-120>",
2133 NO_STR
2134 "Minimum interval between regenerating same LSP\n"
2135 "Set interval for level 1 only\n"
hassof390d2c2004-09-10 20:48:21 +00002136 "Minimum interval in seconds\n")
jardineb5d44e2003-12-23 08:09:43 +00002137
2138DEFUN (lsp_gen_interval_l2,
2139 lsp_gen_interval_l2_cmd,
2140 "lsp-gen-interval level-2 <1-120>",
2141 "Minimum interval between regenerating same LSP\n"
2142 "Set interval for level 2 only\n"
hassof390d2c2004-09-10 20:48:21 +00002143 "Minimum interval in seconds\n")
jardineb5d44e2003-12-23 08:09:43 +00002144{
2145 struct isis_area *area;
Josh Bailey3f045a02012-03-24 08:35:20 -07002146 uint16_t interval;
2147 int level;
jardineb5d44e2003-12-23 08:09:43 +00002148
2149 area = vty->index;
jardineb5d44e2003-12-23 08:09:43 +00002150 interval = atoi (argv[0]);
Josh Bailey3f045a02012-03-24 08:35:20 -07002151 level = IS_LEVEL_2;
2152 return set_lsp_gen_interval (vty, area, interval, level);
jardineb5d44e2003-12-23 08:09:43 +00002153}
2154
2155DEFUN (no_lsp_gen_interval_l2,
2156 no_lsp_gen_interval_l2_cmd,
2157 "no lsp-gen-interval level-2",
2158 NO_STR
2159 "Minimum interval between regenerating same LSP\n"
hassof390d2c2004-09-10 20:48:21 +00002160 "Set interval for level 2 only\n")
jardineb5d44e2003-12-23 08:09:43 +00002161{
2162 struct isis_area *area;
Josh Bailey3f045a02012-03-24 08:35:20 -07002163 uint16_t interval;
2164 int level;
jardineb5d44e2003-12-23 08:09:43 +00002165
2166 area = vty->index;
Josh Bailey3f045a02012-03-24 08:35:20 -07002167 interval = DEFAULT_MIN_LSP_GEN_INTERVAL;
2168 level = IS_LEVEL_2;
2169 return set_lsp_gen_interval (vty, area, interval, level);
jardineb5d44e2003-12-23 08:09:43 +00002170}
2171
2172ALIAS (no_lsp_gen_interval_l2,
2173 no_lsp_gen_interval_l2_arg_cmd,
2174 "no lsp-gen-interval level-2 <1-120>",
2175 NO_STR
2176 "Minimum interval between regenerating same LSP\n"
2177 "Set interval for level 2 only\n"
hassof390d2c2004-09-10 20:48:21 +00002178 "Minimum interval in seconds\n")
jardineb5d44e2003-12-23 08:09:43 +00002179
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002180static int
2181validate_metric_style_narrow (struct vty *vty, struct isis_area *area)
2182{
2183 struct isis_circuit *circuit;
2184 struct listnode *node;
2185
2186 if (! vty)
2187 return CMD_ERR_AMBIGUOUS;
2188
2189 if (! area)
2190 {
2191 vty_out (vty, "ISIS area is invalid%s", VTY_NEWLINE);
2192 return CMD_ERR_AMBIGUOUS;
2193 }
2194
2195 for (ALL_LIST_ELEMENTS_RO (area->circuit_list, node, circuit))
2196 {
2197 if ((area->is_type & IS_LEVEL_1) &&
2198 (circuit->is_type & IS_LEVEL_1) &&
Christian Franke4fb7c842012-11-27 19:51:59 +00002199 (circuit->te_metric[0] > MAX_NARROW_LINK_METRIC))
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002200 {
2201 vty_out (vty, "ISIS circuit %s metric is invalid%s",
2202 circuit->interface->name, VTY_NEWLINE);
2203 return CMD_ERR_AMBIGUOUS;
2204 }
2205 if ((area->is_type & IS_LEVEL_2) &&
2206 (circuit->is_type & IS_LEVEL_2) &&
Christian Franke4fb7c842012-11-27 19:51:59 +00002207 (circuit->te_metric[1] > MAX_NARROW_LINK_METRIC))
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002208 {
2209 vty_out (vty, "ISIS circuit %s metric is invalid%s",
2210 circuit->interface->name, VTY_NEWLINE);
2211 return CMD_ERR_AMBIGUOUS;
2212 }
2213 }
2214
2215 return CMD_SUCCESS;
2216}
2217
jardineb5d44e2003-12-23 08:09:43 +00002218DEFUN (metric_style,
2219 metric_style_cmd,
hasso2984d262005-09-26 16:49:07 +00002220 "metric-style (narrow|transition|wide)",
jardineb5d44e2003-12-23 08:09:43 +00002221 "Use old-style (ISO 10589) or new-style packet formats\n"
2222 "Use old style of TLVs with narrow metric\n"
hasso2984d262005-09-26 16:49:07 +00002223 "Send and accept both styles of TLVs during transition\n"
jardineb5d44e2003-12-23 08:09:43 +00002224 "Use new style of TLVs to carry wider metric\n")
2225{
2226 struct isis_area *area;
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002227 int ret;
jardineb5d44e2003-12-23 08:09:43 +00002228
2229 area = vty->index;
2230 assert (area);
hasso2984d262005-09-26 16:49:07 +00002231
2232 if (strncmp (argv[0], "w", 1) == 0)
2233 {
2234 area->newmetric = 1;
2235 area->oldmetric = 0;
2236 }
Christian Franke478c1122012-11-27 19:52:00 +00002237 else
hasso2984d262005-09-26 16:49:07 +00002238 {
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002239 ret = validate_metric_style_narrow (vty, area);
2240 if (ret != CMD_SUCCESS)
2241 return ret;
2242
Christian Franke478c1122012-11-27 19:52:00 +00002243 if (strncmp (argv[0], "t", 1) == 0)
2244 {
2245 area->newmetric = 1;
2246 area->oldmetric = 1;
2247 }
2248 else if (strncmp (argv[0], "n", 1) == 0)
2249 {
2250 area->newmetric = 0;
2251 area->oldmetric = 1;
2252 }
hasso2984d262005-09-26 16:49:07 +00002253 }
jardineb5d44e2003-12-23 08:09:43 +00002254
2255 return CMD_SUCCESS;
2256}
2257
2258DEFUN (no_metric_style,
2259 no_metric_style_cmd,
hasso2984d262005-09-26 16:49:07 +00002260 "no metric-style",
jardineb5d44e2003-12-23 08:09:43 +00002261 NO_STR
hasso2984d262005-09-26 16:49:07 +00002262 "Use old-style (ISO 10589) or new-style packet formats\n")
jardineb5d44e2003-12-23 08:09:43 +00002263{
2264 struct isis_area *area;
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002265 int ret;
jardineb5d44e2003-12-23 08:09:43 +00002266
2267 area = vty->index;
2268 assert (area);
2269
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002270 ret = validate_metric_style_narrow (vty, area);
2271 if (ret != CMD_SUCCESS)
2272 return ret;
2273
hasso2984d262005-09-26 16:49:07 +00002274 /* Default is narrow metric. */
2275 area->newmetric = 0;
2276 area->oldmetric = 1;
jardineb5d44e2003-12-23 08:09:43 +00002277
2278 return CMD_SUCCESS;
2279}
2280
Josh Bailey3f045a02012-03-24 08:35:20 -07002281DEFUN (set_overload_bit,
2282 set_overload_bit_cmd,
2283 "set-overload-bit",
2284 "Set overload bit to avoid any transit traffic\n"
2285 "Set overload bit\n")
2286{
2287 struct isis_area *area;
2288
2289 area = vty->index;
2290 assert (area);
2291
2292 area->overload_bit = LSPBIT_OL;
2293 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
2294
2295 return CMD_SUCCESS;
2296}
2297
2298DEFUN (no_set_overload_bit,
2299 no_set_overload_bit_cmd,
2300 "no set-overload-bit",
2301 "Reset overload bit to accept transit traffic\n"
2302 "Reset overload bit\n")
2303{
2304 struct isis_area *area;
2305
2306 area = vty->index;
2307 assert (area);
2308
2309 area->overload_bit = 0;
2310 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
2311
2312 return CMD_SUCCESS;
2313}
2314
Amritha Nambiarc8ee9402015-08-24 16:40:14 -07002315DEFUN (set_attached_bit,
2316 set_attached_bit_cmd,
2317 "set-attached-bit",
2318 "Set attached bit to identify as L1/L2 router for inter-area traffic\n"
2319 "Set attached bit\n")
2320{
2321 struct isis_area *area;
2322
2323 area = vty->index;
2324 assert (area);
2325
2326 area->attached_bit = LSPBIT_ATT;
2327 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
2328
2329 return CMD_SUCCESS;
2330}
2331
2332DEFUN (no_set_attached_bit,
2333 no_set_attached_bit_cmd,
2334 "no set-attached-bit",
2335 "Reset attached bit\n")
2336{
2337 struct isis_area *area;
2338
2339 area = vty->index;
2340 assert (area);
2341
2342 area->attached_bit = 0;
2343 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
2344
2345 return CMD_SUCCESS;
2346}
2347
jardineb5d44e2003-12-23 08:09:43 +00002348DEFUN (dynamic_hostname,
2349 dynamic_hostname_cmd,
2350 "hostname dynamic",
2351 "Dynamic hostname for IS-IS\n"
hassof390d2c2004-09-10 20:48:21 +00002352 "Dynamic hostname\n")
jardineb5d44e2003-12-23 08:09:43 +00002353{
2354 struct isis_area *area;
2355
2356 area = vty->index;
2357 assert (area);
hassof390d2c2004-09-10 20:48:21 +00002358
Josh Bailey3f045a02012-03-24 08:35:20 -07002359 if (!area->dynhostname)
2360 {
2361 area->dynhostname = 1;
2362 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 0);
2363 }
hassof390d2c2004-09-10 20:48:21 +00002364
jardineb5d44e2003-12-23 08:09:43 +00002365 return CMD_SUCCESS;
2366}
2367
2368DEFUN (no_dynamic_hostname,
2369 no_dynamic_hostname_cmd,
2370 "no hostname dynamic",
2371 NO_STR
2372 "Dynamic hostname for IS-IS\n"
hassof390d2c2004-09-10 20:48:21 +00002373 "Dynamic hostname\n")
jardineb5d44e2003-12-23 08:09:43 +00002374{
2375 struct isis_area *area;
2376
2377 area = vty->index;
2378 assert (area);
hassof390d2c2004-09-10 20:48:21 +00002379
Josh Bailey3f045a02012-03-24 08:35:20 -07002380 if (area->dynhostname)
2381 {
2382 area->dynhostname = 0;
2383 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 0);
2384 }
hassof390d2c2004-09-10 20:48:21 +00002385
jardineb5d44e2003-12-23 08:09:43 +00002386 return CMD_SUCCESS;
2387}
2388
2389DEFUN (spf_interval,
2390 spf_interval_cmd,
2391 "spf-interval <1-120>",
hasso2097cd82003-12-23 11:51:08 +00002392 "Minimum interval between SPF calculations\n"
jardineb5d44e2003-12-23 08:09:43 +00002393 "Minimum interval between consecutive SPFs in seconds\n")
2394{
2395 struct isis_area *area;
2396 u_int16_t interval;
hassof390d2c2004-09-10 20:48:21 +00002397
jardineb5d44e2003-12-23 08:09:43 +00002398 area = vty->index;
2399 interval = atoi (argv[0]);
2400 area->min_spf_interval[0] = interval;
2401 area->min_spf_interval[1] = interval;
hassof390d2c2004-09-10 20:48:21 +00002402
jardineb5d44e2003-12-23 08:09:43 +00002403 return CMD_SUCCESS;
2404}
2405
2406DEFUN (no_spf_interval,
2407 no_spf_interval_cmd,
2408 "no spf-interval",
2409 NO_STR
hassof390d2c2004-09-10 20:48:21 +00002410 "Minimum interval between SPF calculations\n")
jardineb5d44e2003-12-23 08:09:43 +00002411{
2412 struct isis_area *area;
hassof390d2c2004-09-10 20:48:21 +00002413
jardineb5d44e2003-12-23 08:09:43 +00002414 area = vty->index;
2415
2416 area->min_spf_interval[0] = MINIMUM_SPF_INTERVAL;
2417 area->min_spf_interval[1] = MINIMUM_SPF_INTERVAL;
hassof390d2c2004-09-10 20:48:21 +00002418
jardineb5d44e2003-12-23 08:09:43 +00002419 return CMD_SUCCESS;
2420}
2421
2422ALIAS (no_spf_interval,
2423 no_spf_interval_arg_cmd,
2424 "no spf-interval <1-120>",
2425 NO_STR
2426 "Minimum interval between SPF calculations\n"
hassof390d2c2004-09-10 20:48:21 +00002427 "Minimum interval between consecutive SPFs in seconds\n")
jardineb5d44e2003-12-23 08:09:43 +00002428
2429DEFUN (spf_interval_l1,
2430 spf_interval_l1_cmd,
2431 "spf-interval level-1 <1-120>",
2432 "Minimum interval between SPF calculations\n"
2433 "Set interval for level 1 only\n"
2434 "Minimum interval between consecutive SPFs in seconds\n")
2435{
2436 struct isis_area *area;
2437 u_int16_t interval;
hassof390d2c2004-09-10 20:48:21 +00002438
jardineb5d44e2003-12-23 08:09:43 +00002439 area = vty->index;
2440 interval = atoi (argv[0]);
2441 area->min_spf_interval[0] = interval;
hassof390d2c2004-09-10 20:48:21 +00002442
jardineb5d44e2003-12-23 08:09:43 +00002443 return CMD_SUCCESS;
2444}
2445
2446DEFUN (no_spf_interval_l1,
2447 no_spf_interval_l1_cmd,
2448 "no spf-interval level-1",
2449 NO_STR
2450 "Minimum interval between SPF calculations\n"
2451 "Set interval for level 1 only\n")
2452{
2453 struct isis_area *area;
hassof390d2c2004-09-10 20:48:21 +00002454
jardineb5d44e2003-12-23 08:09:43 +00002455 area = vty->index;
2456
2457 area->min_spf_interval[0] = MINIMUM_SPF_INTERVAL;
hassof390d2c2004-09-10 20:48:21 +00002458
jardineb5d44e2003-12-23 08:09:43 +00002459 return CMD_SUCCESS;
2460}
2461
2462ALIAS (no_spf_interval,
2463 no_spf_interval_l1_arg_cmd,
2464 "no spf-interval level-1 <1-120>",
2465 NO_STR
2466 "Minimum interval between SPF calculations\n"
2467 "Set interval for level 1 only\n"
2468 "Minimum interval between consecutive SPFs in seconds\n")
2469
2470DEFUN (spf_interval_l2,
2471 spf_interval_l2_cmd,
2472 "spf-interval level-2 <1-120>",
2473 "Minimum interval between SPF calculations\n"
2474 "Set interval for level 2 only\n"
2475 "Minimum interval between consecutive SPFs in seconds\n")
2476{
2477 struct isis_area *area;
2478 u_int16_t interval;
hassof390d2c2004-09-10 20:48:21 +00002479
jardineb5d44e2003-12-23 08:09:43 +00002480 area = vty->index;
2481 interval = atoi (argv[0]);
2482 area->min_spf_interval[1] = interval;
hassof390d2c2004-09-10 20:48:21 +00002483
jardineb5d44e2003-12-23 08:09:43 +00002484 return CMD_SUCCESS;
2485}
2486
2487DEFUN (no_spf_interval_l2,
2488 no_spf_interval_l2_cmd,
2489 "no spf-interval level-2",
2490 NO_STR
2491 "Minimum interval between SPF calculations\n"
2492 "Set interval for level 2 only\n")
2493{
2494 struct isis_area *area;
hassof390d2c2004-09-10 20:48:21 +00002495
jardineb5d44e2003-12-23 08:09:43 +00002496 area = vty->index;
2497
2498 area->min_spf_interval[1] = MINIMUM_SPF_INTERVAL;
hassof390d2c2004-09-10 20:48:21 +00002499
jardineb5d44e2003-12-23 08:09:43 +00002500 return CMD_SUCCESS;
2501}
2502
2503ALIAS (no_spf_interval,
2504 no_spf_interval_l2_arg_cmd,
2505 "no spf-interval level-2 <1-120>",
2506 NO_STR
2507 "Minimum interval between SPF calculations\n"
2508 "Set interval for level 2 only\n"
2509 "Minimum interval between consecutive SPFs in seconds\n")
2510
Josh Bailey3f045a02012-03-24 08:35:20 -07002511static int
2512set_lsp_max_lifetime (struct vty *vty, struct isis_area *area,
2513 uint16_t interval, int level)
2514{
2515 int lvl;
2516 int set_refresh_interval[ISIS_LEVELS] = {0, 0};
2517 uint16_t refresh_interval;
2518
2519 refresh_interval = interval - 300;
2520
2521 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; lvl++)
2522 {
2523 if (!(lvl & level))
2524 continue;
2525 if (refresh_interval < area->lsp_refresh[lvl-1])
2526 {
2527 vty_out (vty, "Level %d Max LSP lifetime %us must be 300s greater than "
2528 "the configured LSP refresh interval %us%s",
2529 lvl, interval, area->lsp_refresh[lvl-1], VTY_NEWLINE);
2530 vty_out (vty, "Automatically reducing level %d LSP refresh interval "
2531 "to %us%s", lvl, refresh_interval, VTY_NEWLINE);
2532 set_refresh_interval[lvl-1] = 1;
2533
2534 if (refresh_interval <= area->lsp_gen_interval[lvl-1])
2535 {
2536 vty_out (vty, "LSP refresh interval %us must be greater than "
2537 "the configured LSP gen interval %us%s",
2538 refresh_interval, area->lsp_gen_interval[lvl-1],
2539 VTY_NEWLINE);
2540 return CMD_ERR_AMBIGUOUS;
2541 }
2542 }
2543 }
2544
2545 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; lvl++)
2546 {
2547 if (!(lvl & level))
2548 continue;
2549 area->max_lsp_lifetime[lvl-1] = interval;
2550 /* Automatically reducing lsp_refresh_interval to interval - 300 */
2551 if (set_refresh_interval[lvl-1])
2552 area->lsp_refresh[lvl-1] = refresh_interval;
2553 }
2554
2555 lsp_regenerate_schedule (area, level, 1);
2556
2557 return CMD_SUCCESS;
2558}
2559
2560DEFUN (max_lsp_lifetime,
2561 max_lsp_lifetime_cmd,
2562 "max-lsp-lifetime <350-65535>",
2563 "Maximum LSP lifetime\n"
2564 "LSP lifetime in seconds\n")
2565{
2566 struct isis_area *area;
2567 uint16_t interval;
2568 int level;
2569
2570 area = vty->index;
2571 interval = atoi (argv[0]);
2572 level = IS_LEVEL_1 | IS_LEVEL_2;
2573 return set_lsp_max_lifetime (vty, area, interval, level);
2574}
2575
2576DEFUN (no_max_lsp_lifetime,
2577 no_max_lsp_lifetime_cmd,
2578 "no max-lsp-lifetime",
2579 NO_STR
2580 "LSP lifetime in seconds\n")
2581{
2582 struct isis_area *area;
2583 uint16_t interval;
2584 int level;
2585
2586 area = vty->index;
2587 interval = DEFAULT_LSP_LIFETIME;
2588 level = IS_LEVEL_1 | IS_LEVEL_2;
2589 return set_lsp_max_lifetime (vty, area, interval, level);
2590}
2591
2592ALIAS (no_max_lsp_lifetime,
2593 no_max_lsp_lifetime_arg_cmd,
2594 "no max-lsp-lifetime <350-65535>",
2595 NO_STR
2596 "Maximum LSP lifetime\n"
2597 "LSP lifetime in seconds\n")
2598
2599DEFUN (max_lsp_lifetime_l1,
2600 max_lsp_lifetime_l1_cmd,
2601 "max-lsp-lifetime level-1 <350-65535>",
2602 "Maximum LSP lifetime for Level 1 only\n"
2603 "LSP lifetime for Level 1 only in seconds\n")
2604{
2605 struct isis_area *area;
2606 uint16_t interval;
2607 int level;
2608
2609 area = vty->index;
2610 interval = atoi (argv[0]);
2611 level = IS_LEVEL_1;
2612 return set_lsp_max_lifetime (vty, area, interval, level);
2613}
2614
2615DEFUN (no_max_lsp_lifetime_l1,
2616 no_max_lsp_lifetime_l1_cmd,
2617 "no max-lsp-lifetime level-1",
2618 NO_STR
2619 "LSP lifetime for Level 1 only in seconds\n")
2620{
2621 struct isis_area *area;
2622 uint16_t interval;
2623 int level;
2624
2625 area = vty->index;
2626 interval = DEFAULT_LSP_LIFETIME;
2627 level = IS_LEVEL_1;
2628 return set_lsp_max_lifetime (vty, area, interval, level);
2629}
2630
2631ALIAS (no_max_lsp_lifetime_l1,
2632 no_max_lsp_lifetime_l1_arg_cmd,
2633 "no max-lsp-lifetime level-1 <350-65535>",
2634 NO_STR
2635 "Maximum LSP lifetime for Level 1 only\n"
2636 "LSP lifetime for Level 1 only in seconds\n")
2637
2638DEFUN (max_lsp_lifetime_l2,
2639 max_lsp_lifetime_l2_cmd,
2640 "max-lsp-lifetime level-2 <350-65535>",
2641 "Maximum LSP lifetime for Level 2 only\n"
2642 "LSP lifetime for Level 2 only in seconds\n")
2643{
2644 struct isis_area *area;
2645 uint16_t interval;
2646 int level;
2647
2648 area = vty->index;
2649 interval = atoi (argv[0]);
2650 level = IS_LEVEL_2;
2651 return set_lsp_max_lifetime (vty, area, interval, level);
2652}
2653
2654DEFUN (no_max_lsp_lifetime_l2,
2655 no_max_lsp_lifetime_l2_cmd,
2656 "no max-lsp-lifetime level-2",
2657 NO_STR
2658 "LSP lifetime for Level 2 only in seconds\n")
2659{
2660 struct isis_area *area;
2661 uint16_t interval;
2662 int level;
2663
2664 area = vty->index;
2665 interval = DEFAULT_LSP_LIFETIME;
2666 level = IS_LEVEL_2;
2667 return set_lsp_max_lifetime (vty, area, interval, level);
2668}
2669
2670ALIAS (no_max_lsp_lifetime_l2,
2671 no_max_lsp_lifetime_l2_arg_cmd,
2672 "no max-lsp-lifetime level-2 <350-65535>",
2673 NO_STR
2674 "Maximum LSP lifetime for Level 2 only\n"
2675 "LSP lifetime for Level 2 only in seconds\n")
2676
2677static int
2678set_lsp_refresh_interval (struct vty *vty, struct isis_area *area,
2679 uint16_t interval, int level)
2680{
2681 int lvl;
2682
2683 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl)
2684 {
2685 if (!(lvl & level))
2686 continue;
2687 if (interval <= area->lsp_gen_interval[lvl-1])
2688 {
2689 vty_out (vty, "LSP refresh interval %us must be greater than "
2690 "the configured LSP gen interval %us%s",
2691 interval, area->lsp_gen_interval[lvl-1],
2692 VTY_NEWLINE);
2693 return CMD_ERR_AMBIGUOUS;
2694 }
2695 if (interval > (area->max_lsp_lifetime[lvl-1] - 300))
2696 {
2697 vty_out (vty, "LSP refresh interval %us must be less than "
2698 "the configured LSP lifetime %us less 300%s",
2699 interval, area->max_lsp_lifetime[lvl-1],
2700 VTY_NEWLINE);
2701 return CMD_ERR_AMBIGUOUS;
2702 }
2703 }
2704
2705 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl)
2706 {
2707 if (!(lvl & level))
2708 continue;
2709 area->lsp_refresh[lvl-1] = interval;
2710 }
2711 lsp_regenerate_schedule (area, level, 1);
2712
2713 return CMD_SUCCESS;
2714}
2715
2716DEFUN (lsp_refresh_interval,
2717 lsp_refresh_interval_cmd,
2718 "lsp-refresh-interval <1-65235>",
2719 "LSP refresh interval\n"
2720 "LSP refresh interval in seconds\n")
2721{
2722 struct isis_area *area;
2723 uint16_t interval;
2724 int level;
2725
2726 area = vty->index;
2727 interval = atoi (argv[0]);
2728 level = IS_LEVEL_1 | IS_LEVEL_2;
2729 return set_lsp_refresh_interval (vty, area, interval, level);
2730}
2731
2732DEFUN (no_lsp_refresh_interval,
2733 no_lsp_refresh_interval_cmd,
2734 "no lsp-refresh-interval",
2735 NO_STR
2736 "LSP refresh interval in seconds\n")
2737{
2738 struct isis_area *area;
2739 uint16_t interval;
2740 int level;
2741
2742 area = vty->index;
2743 interval = DEFAULT_MAX_LSP_GEN_INTERVAL;
2744 level = IS_LEVEL_1 | IS_LEVEL_2;
2745 return set_lsp_refresh_interval (vty, area, interval, level);
2746}
2747
2748ALIAS (no_lsp_refresh_interval,
2749 no_lsp_refresh_interval_arg_cmd,
2750 "no lsp-refresh-interval <1-65235>",
2751 NO_STR
2752 "LSP refresh interval\n"
2753 "LSP refresh interval in seconds\n")
2754
2755DEFUN (lsp_refresh_interval_l1,
2756 lsp_refresh_interval_l1_cmd,
2757 "lsp-refresh-interval level-1 <1-65235>",
2758 "LSP refresh interval for Level 1 only\n"
2759 "LSP refresh interval for Level 1 only in seconds\n")
2760{
2761 struct isis_area *area;
2762 uint16_t interval;
2763 int level;
2764
2765 area = vty->index;
2766 interval = atoi (argv[0]);
2767 level = IS_LEVEL_1;
2768 return set_lsp_refresh_interval (vty, area, interval, level);
2769}
2770
2771DEFUN (no_lsp_refresh_interval_l1,
2772 no_lsp_refresh_interval_l1_cmd,
2773 "no lsp-refresh-interval level-1",
2774 NO_STR
2775 "LSP refresh interval for Level 1 only in seconds\n")
2776{
2777 struct isis_area *area;
2778 uint16_t interval;
2779 int level;
2780
2781 area = vty->index;
2782 interval = DEFAULT_MAX_LSP_GEN_INTERVAL;
2783 level = IS_LEVEL_1;
2784 return set_lsp_refresh_interval (vty, area, interval, level);
2785}
2786
2787ALIAS (no_lsp_refresh_interval_l1,
2788 no_lsp_refresh_interval_l1_arg_cmd,
2789 "no lsp-refresh-interval level-1 <1-65235>",
2790 NO_STR
2791 "LSP refresh interval for Level 1 only\n"
2792 "LSP refresh interval for Level 1 only in seconds\n")
2793
2794DEFUN (lsp_refresh_interval_l2,
2795 lsp_refresh_interval_l2_cmd,
2796 "lsp-refresh-interval level-2 <1-65235>",
2797 "LSP refresh interval for Level 2 only\n"
2798 "LSP refresh interval for Level 2 only in seconds\n")
2799{
2800 struct isis_area *area;
2801 uint16_t interval;
2802 int level;
2803
2804 area = vty->index;
2805 interval = atoi (argv[0]);
2806 level = IS_LEVEL_2;
2807 return set_lsp_refresh_interval (vty, area, interval, level);
2808}
2809
2810DEFUN (no_lsp_refresh_interval_l2,
2811 no_lsp_refresh_interval_l2_cmd,
2812 "no lsp-refresh-interval level-2",
2813 NO_STR
2814 "LSP refresh interval for Level 2 only in seconds\n")
2815{
2816 struct isis_area *area;
2817 uint16_t interval;
2818 int level;
2819
2820 area = vty->index;
2821 interval = DEFAULT_MAX_LSP_GEN_INTERVAL;
2822 level = IS_LEVEL_2;
2823 return set_lsp_refresh_interval (vty, area, interval, level);
2824}
2825
2826ALIAS (no_lsp_refresh_interval_l2,
2827 no_lsp_refresh_interval_l2_arg_cmd,
2828 "no lsp-refresh-interval level-2 <1-65235>",
2829 NO_STR
2830 "LSP refresh interval for Level 2 only\n"
2831 "LSP refresh interval for Level 2 only in seconds\n")
2832
2833DEFUN (log_adj_changes,
2834 log_adj_changes_cmd,
2835 "log-adjacency-changes",
2836 "Log changes in adjacency state\n")
2837{
2838 struct isis_area *area;
2839
2840 area = vty->index;
2841 assert (area);
2842
2843 area->log_adj_changes = 1;
2844
2845 return CMD_SUCCESS;
2846}
2847
2848DEFUN (no_log_adj_changes,
2849 no_log_adj_changes_cmd,
2850 "no log-adjacency-changes",
2851 "Stop logging changes in adjacency state\n")
2852{
2853 struct isis_area *area;
2854
2855 area = vty->index;
2856 assert (area);
2857
2858 area->log_adj_changes = 0;
2859
2860 return CMD_SUCCESS;
2861}
2862
jardineb5d44e2003-12-23 08:09:43 +00002863#ifdef TOPOLOGY_GENERATE
Josh Bailey3f045a02012-03-24 08:35:20 -07002864
jardineb5d44e2003-12-23 08:09:43 +00002865DEFUN (topology_generate_grid,
2866 topology_generate_grid_cmd,
2867 "topology generate grid <1-100> <1-100> <1-65000> [param] [param] "
2868 "[param]",
hassof1082d12005-09-19 04:23:34 +00002869 "Topology generation for IS-IS\n"
2870 "Topology generation\n"
2871 "Grid topology\n"
jardineb5d44e2003-12-23 08:09:43 +00002872 "X parameter of the grid\n"
2873 "Y parameter of the grid\n"
2874 "Random seed\n"
2875 "Optional param 1\n"
2876 "Optional param 2\n"
2877 "Optional param 3\n"
2878 "Topology\n")
2879{
2880 struct isis_area *area;
2881
2882 area = vty->index;
2883 assert (area);
2884
hassof390d2c2004-09-10 20:48:21 +00002885 if (!spgrid_check_params (vty, argc, argv))
2886 {
2887 if (area->topology)
2888 list_delete (area->topology);
2889 area->topology = list_new ();
2890 memcpy (area->top_params, vty->buf, 200);
2891 gen_spgrid_topology (vty, area->topology);
2892 remove_topology_lsps (area);
2893 generate_topology_lsps (area);
hassof1082d12005-09-19 04:23:34 +00002894 /* Regenerate L1 LSP to get two way connection to the generated
2895 * topology. */
Josh Bailey3f045a02012-03-24 08:35:20 -07002896 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
hassof390d2c2004-09-10 20:48:21 +00002897 }
jardineb5d44e2003-12-23 08:09:43 +00002898
2899 return CMD_SUCCESS;
2900}
2901
hassof695b012005-04-02 19:03:39 +00002902DEFUN (show_isis_generated_topology,
2903 show_isis_generated_topology_cmd,
hassof1082d12005-09-19 04:23:34 +00002904 "show isis generated-topologies",
jardineb5d44e2003-12-23 08:09:43 +00002905 SHOW_STR
Josh Bailey3f045a02012-03-24 08:35:20 -07002906 "ISIS network information\n"
hassof1082d12005-09-19 04:23:34 +00002907 "Show generated topologies\n")
jardineb5d44e2003-12-23 08:09:43 +00002908{
2909 struct isis_area *area;
paul92c9f222005-05-25 12:21:13 +00002910 struct listnode *node;
jardineb5d44e2003-12-23 08:09:43 +00002911 struct listnode *node2;
2912 struct arc *arc;
hassof1082d12005-09-19 04:23:34 +00002913
paul92c9f222005-05-25 12:21:13 +00002914 for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
hassof1082d12005-09-19 04:23:34 +00002915 {
2916 if (!area->topology)
2917 continue;
2918
2919 vty_out (vty, "Topology for isis area: %s%s", area->area_tag,
2920 VTY_NEWLINE);
2921 vty_out (vty, "From node To node Distance%s", VTY_NEWLINE);
2922
2923 for (ALL_LIST_ELEMENTS_RO (area->topology, node2, arc))
2924 vty_out (vty, "%9ld %11ld %12ld%s", arc->from_node, arc->to_node,
2925 arc->distance, VTY_NEWLINE);
2926 }
jardineb5d44e2003-12-23 08:09:43 +00002927 return CMD_SUCCESS;
2928}
2929
hassof1082d12005-09-19 04:23:34 +00002930/* Base IS for topology generation. */
hassof390d2c2004-09-10 20:48:21 +00002931DEFUN (topology_baseis,
jardineb5d44e2003-12-23 08:09:43 +00002932 topology_baseis_cmd,
2933 "topology base-is WORD",
hassof1082d12005-09-19 04:23:34 +00002934 "Topology generation for IS-IS\n"
2935 "A Network IS Base for this topology\n"
2936 "XXXX.XXXX.XXXX Network entity title (NET)\n")
jardineb5d44e2003-12-23 08:09:43 +00002937{
2938 struct isis_area *area;
2939 u_char buff[ISIS_SYS_ID_LEN];
2940
2941 area = vty->index;
2942 assert (area);
2943
hassof390d2c2004-09-10 20:48:21 +00002944 if (sysid2buff (buff, argv[0]))
hassof1082d12005-09-19 04:23:34 +00002945 sysid2buff (area->topology_baseis, argv[0]);
hassof390d2c2004-09-10 20:48:21 +00002946
jardineb5d44e2003-12-23 08:09:43 +00002947 return CMD_SUCCESS;
2948}
2949
jardineb5d44e2003-12-23 08:09:43 +00002950DEFUN (no_topology_baseis,
2951 no_topology_baseis_cmd,
2952 "no topology base-is WORD",
2953 NO_STR
hassof1082d12005-09-19 04:23:34 +00002954 "Topology generation for IS-IS\n"
2955 "A Network IS Base for this topology\n"
2956 "XXXX.XXXX.XXXX Network entity title (NET)\n")
jardineb5d44e2003-12-23 08:09:43 +00002957{
2958 struct isis_area *area;
2959
2960 area = vty->index;
2961 assert (area);
2962
hassof390d2c2004-09-10 20:48:21 +00002963 memcpy (area->topology_baseis, DEFAULT_TOPOLOGY_BASEIS, ISIS_SYS_ID_LEN);
jardineb5d44e2003-12-23 08:09:43 +00002964 return CMD_SUCCESS;
2965}
2966
hassof1082d12005-09-19 04:23:34 +00002967ALIAS (no_topology_baseis,
2968 no_topology_baseis_noid_cmd,
2969 "no topology base-is",
2970 NO_STR
2971 "Topology generation for IS-IS\n"
2972 "A Network IS Base for this topology\n")
2973
2974DEFUN (topology_basedynh,
2975 topology_basedynh_cmd,
2976 "topology base-dynh WORD",
2977 "Topology generation for IS-IS\n"
2978 "Dynamic hostname base for this topology\n"
2979 "Dynamic hostname base\n")
2980{
2981 struct isis_area *area;
2982
2983 area = vty->index;
2984 assert (area);
2985
2986 /* I hope that it's enough. */
2987 area->topology_basedynh = strndup (argv[0], 16);
2988 return CMD_SUCCESS;
2989}
Josh Bailey3f045a02012-03-24 08:35:20 -07002990
jardineb5d44e2003-12-23 08:09:43 +00002991#endif /* TOPOLOGY_GENERATE */
2992
jardineb5d44e2003-12-23 08:09:43 +00002993/* IS-IS configuration write function */
2994int
2995isis_config_write (struct vty *vty)
2996{
2997 int write = 0;
jardineb5d44e2003-12-23 08:09:43 +00002998
hassof390d2c2004-09-10 20:48:21 +00002999 if (isis != NULL)
3000 {
3001 struct isis_area *area;
hasso3fdb2dd2005-09-28 18:45:54 +00003002 struct listnode *node, *node2;
jardineb5d44e2003-12-23 08:09:43 +00003003
hasso3fdb2dd2005-09-28 18:45:54 +00003004 for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
hassof390d2c2004-09-10 20:48:21 +00003005 {
3006 /* ISIS - Area name */
3007 vty_out (vty, "router isis %s%s", area->area_tag, VTY_NEWLINE);
3008 write++;
3009 /* ISIS - Net */
3010 if (listcount (area->area_addrs) > 0)
3011 {
3012 struct area_addr *area_addr;
hasso3fdb2dd2005-09-28 18:45:54 +00003013 for (ALL_LIST_ELEMENTS_RO (area->area_addrs, node2, area_addr))
3014 {
3015 vty_out (vty, " net %s%s",
3016 isonet_print (area_addr->area_addr,
3017 area_addr->addr_len + ISIS_SYS_ID_LEN +
3018 1), VTY_NEWLINE);
3019 write++;
3020 }
hassof390d2c2004-09-10 20:48:21 +00003021 }
hasso3fdb2dd2005-09-28 18:45:54 +00003022 /* ISIS - Dynamic hostname - Defaults to true so only display if
3023 * false. */
hassof390d2c2004-09-10 20:48:21 +00003024 if (!area->dynhostname)
3025 {
3026 vty_out (vty, " no hostname dynamic%s", VTY_NEWLINE);
3027 write++;
3028 }
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07003029 /* ISIS - Metric-Style - when true displays wide */
3030 if (area->newmetric)
hassof390d2c2004-09-10 20:48:21 +00003031 {
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07003032 if (!area->oldmetric)
3033 vty_out (vty, " metric-style wide%s", VTY_NEWLINE);
hasso2984d262005-09-26 16:49:07 +00003034 else
3035 vty_out (vty, " metric-style transition%s", VTY_NEWLINE);
hassof390d2c2004-09-10 20:48:21 +00003036 write++;
3037 }
Christian Frankef818c8f2012-11-27 01:10:28 +00003038 else
3039 {
3040 vty_out (vty, " metric-style narrow%s", VTY_NEWLINE);
3041 write++;
3042 }
Josh Bailey3f045a02012-03-24 08:35:20 -07003043 /* ISIS - overload-bit */
3044 if (area->overload_bit)
3045 {
3046 vty_out (vty, " set-overload-bit%s", VTY_NEWLINE);
3047 write++;
3048 }
hassof390d2c2004-09-10 20:48:21 +00003049 /* ISIS - Area is-type (level-1-2 is default) */
3050 if (area->is_type == IS_LEVEL_1)
3051 {
3052 vty_out (vty, " is-type level-1%s", VTY_NEWLINE);
3053 write++;
3054 }
Josh Bailey3f045a02012-03-24 08:35:20 -07003055 else if (area->is_type == IS_LEVEL_2)
hassof390d2c2004-09-10 20:48:21 +00003056 {
Josh Bailey3f045a02012-03-24 08:35:20 -07003057 vty_out (vty, " is-type level-2-only%s", VTY_NEWLINE);
3058 write++;
hassof390d2c2004-09-10 20:48:21 +00003059 }
Christian Frankeacf98652015-11-12 14:24:22 +01003060 write += isis_redist_config_write(vty, area, AF_INET);
3061 write += isis_redist_config_write(vty, area, AF_INET6);
hassof390d2c2004-09-10 20:48:21 +00003062 /* ISIS - Lsp generation interval */
3063 if (area->lsp_gen_interval[0] == area->lsp_gen_interval[1])
3064 {
Josh Bailey3f045a02012-03-24 08:35:20 -07003065 if (area->lsp_gen_interval[0] != DEFAULT_MIN_LSP_GEN_INTERVAL)
hassof390d2c2004-09-10 20:48:21 +00003066 {
3067 vty_out (vty, " lsp-gen-interval %d%s",
3068 area->lsp_gen_interval[0], VTY_NEWLINE);
3069 write++;
3070 }
3071 }
3072 else
3073 {
Josh Bailey3f045a02012-03-24 08:35:20 -07003074 if (area->lsp_gen_interval[0] != DEFAULT_MIN_LSP_GEN_INTERVAL)
hassof390d2c2004-09-10 20:48:21 +00003075 {
3076 vty_out (vty, " lsp-gen-interval level-1 %d%s",
3077 area->lsp_gen_interval[0], VTY_NEWLINE);
3078 write++;
3079 }
Josh Bailey3f045a02012-03-24 08:35:20 -07003080 if (area->lsp_gen_interval[1] != DEFAULT_MIN_LSP_GEN_INTERVAL)
hassof390d2c2004-09-10 20:48:21 +00003081 {
3082 vty_out (vty, " lsp-gen-interval level-2 %d%s",
3083 area->lsp_gen_interval[1], VTY_NEWLINE);
3084 write++;
3085 }
3086 }
3087 /* ISIS - LSP lifetime */
3088 if (area->max_lsp_lifetime[0] == area->max_lsp_lifetime[1])
3089 {
Josh Bailey3f045a02012-03-24 08:35:20 -07003090 if (area->max_lsp_lifetime[0] != DEFAULT_LSP_LIFETIME)
hassof390d2c2004-09-10 20:48:21 +00003091 {
Josh Bailey3f045a02012-03-24 08:35:20 -07003092 vty_out (vty, " max-lsp-lifetime %u%s", area->max_lsp_lifetime[0],
hassof390d2c2004-09-10 20:48:21 +00003093 VTY_NEWLINE);
3094 write++;
3095 }
3096 }
3097 else
3098 {
Josh Bailey3f045a02012-03-24 08:35:20 -07003099 if (area->max_lsp_lifetime[0] != DEFAULT_LSP_LIFETIME)
hassof390d2c2004-09-10 20:48:21 +00003100 {
Josh Bailey3f045a02012-03-24 08:35:20 -07003101 vty_out (vty, " max-lsp-lifetime level-1 %u%s",
hassof390d2c2004-09-10 20:48:21 +00003102 area->max_lsp_lifetime[0], VTY_NEWLINE);
3103 write++;
3104 }
Josh Bailey3f045a02012-03-24 08:35:20 -07003105 if (area->max_lsp_lifetime[1] != DEFAULT_LSP_LIFETIME)
hassof390d2c2004-09-10 20:48:21 +00003106 {
Josh Bailey3f045a02012-03-24 08:35:20 -07003107 vty_out (vty, " max-lsp-lifetime level-2 %u%s",
hassof390d2c2004-09-10 20:48:21 +00003108 area->max_lsp_lifetime[1], VTY_NEWLINE);
3109 write++;
3110 }
3111 }
Josh Bailey3f045a02012-03-24 08:35:20 -07003112 /* ISIS - LSP refresh interval */
3113 if (area->lsp_refresh[0] == area->lsp_refresh[1])
3114 {
3115 if (area->lsp_refresh[0] != DEFAULT_MAX_LSP_GEN_INTERVAL)
3116 {
3117 vty_out (vty, " lsp-refresh-interval %u%s", area->lsp_refresh[0],
3118 VTY_NEWLINE);
3119 write++;
3120 }
3121 }
3122 else
3123 {
3124 if (area->lsp_refresh[0] != DEFAULT_MAX_LSP_GEN_INTERVAL)
3125 {
3126 vty_out (vty, " lsp-refresh-interval level-1 %u%s",
3127 area->lsp_refresh[0], VTY_NEWLINE);
3128 write++;
3129 }
3130 if (area->lsp_refresh[1] != DEFAULT_MAX_LSP_GEN_INTERVAL)
3131 {
3132 vty_out (vty, " lsp-refresh-interval level-2 %u%s",
3133 area->lsp_refresh[1], VTY_NEWLINE);
3134 write++;
3135 }
3136 }
Christian Frankef1fc1db2015-11-10 18:43:31 +01003137 if (area->lsp_mtu != DEFAULT_LSP_MTU)
3138 {
3139 vty_out(vty, " lsp-mtu %u%s", area->lsp_mtu, VTY_NEWLINE);
3140 write++;
3141 }
3142
hasso13fb40a2005-10-01 06:03:04 +00003143 /* Minimum SPF interval. */
3144 if (area->min_spf_interval[0] == area->min_spf_interval[1])
3145 {
3146 if (area->min_spf_interval[0] != MINIMUM_SPF_INTERVAL)
3147 {
3148 vty_out (vty, " spf-interval %d%s",
3149 area->min_spf_interval[0], VTY_NEWLINE);
3150 write++;
3151 }
3152 }
3153 else
3154 {
3155 if (area->min_spf_interval[0] != MINIMUM_SPF_INTERVAL)
3156 {
3157 vty_out (vty, " spf-interval level-1 %d%s",
3158 area->min_spf_interval[0], VTY_NEWLINE);
3159 write++;
3160 }
3161 if (area->min_spf_interval[1] != MINIMUM_SPF_INTERVAL)
3162 {
3163 vty_out (vty, " spf-interval level-2 %d%s",
3164 area->min_spf_interval[1], VTY_NEWLINE);
3165 write++;
3166 }
3167 }
hasso53c997c2004-09-15 16:21:59 +00003168 /* Authentication passwords. */
Josh Bailey3f045a02012-03-24 08:35:20 -07003169 if (area->area_passwd.type == ISIS_PASSWD_TYPE_HMAC_MD5)
hasso53c997c2004-09-15 16:21:59 +00003170 {
Josh Bailey3f045a02012-03-24 08:35:20 -07003171 vty_out(vty, " area-password md5 %s", area->area_passwd.passwd);
hasso1cbc5622005-01-01 10:29:51 +00003172 if (CHECK_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND))
3173 {
3174 vty_out(vty, " authenticate snp ");
3175 if (CHECK_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV))
3176 vty_out(vty, "validate");
3177 else
3178 vty_out(vty, "send-only");
3179 }
3180 vty_out(vty, "%s", VTY_NEWLINE);
hasso53c997c2004-09-15 16:21:59 +00003181 write++;
Josh Bailey3f045a02012-03-24 08:35:20 -07003182 }
3183 else if (area->area_passwd.type == ISIS_PASSWD_TYPE_CLEARTXT)
3184 {
3185 vty_out(vty, " area-password clear %s", area->area_passwd.passwd);
3186 if (CHECK_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND))
3187 {
3188 vty_out(vty, " authenticate snp ");
3189 if (CHECK_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV))
3190 vty_out(vty, "validate");
3191 else
3192 vty_out(vty, "send-only");
3193 }
3194 vty_out(vty, "%s", VTY_NEWLINE);
3195 write++;
3196 }
3197 if (area->domain_passwd.type == ISIS_PASSWD_TYPE_HMAC_MD5)
hasso53c997c2004-09-15 16:21:59 +00003198 {
Josh Bailey3f045a02012-03-24 08:35:20 -07003199 vty_out(vty, " domain-password md5 %s",
3200 area->domain_passwd.passwd);
3201 if (CHECK_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND))
3202 {
3203 vty_out(vty, " authenticate snp ");
3204 if (CHECK_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV))
3205 vty_out(vty, "validate");
3206 else
3207 vty_out(vty, "send-only");
3208 }
3209 vty_out(vty, "%s", VTY_NEWLINE);
3210 write++;
3211 }
3212 else if (area->domain_passwd.type == ISIS_PASSWD_TYPE_CLEARTXT)
3213 {
3214 vty_out(vty, " domain-password clear %s",
3215 area->domain_passwd.passwd);
hasso1cbc5622005-01-01 10:29:51 +00003216 if (CHECK_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND))
3217 {
3218 vty_out(vty, " authenticate snp ");
3219 if (CHECK_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV))
3220 vty_out(vty, "validate");
3221 else
3222 vty_out(vty, "send-only");
3223 }
3224 vty_out(vty, "%s", VTY_NEWLINE);
hasso53c997c2004-09-15 16:21:59 +00003225 write++;
3226 }
hassof1082d12005-09-19 04:23:34 +00003227
Josh Bailey3f045a02012-03-24 08:35:20 -07003228 if (area->log_adj_changes)
3229 {
3230 vty_out (vty, " log-adjacency-changes%s", VTY_NEWLINE);
3231 write++;
3232 }
3233
hassof390d2c2004-09-10 20:48:21 +00003234#ifdef TOPOLOGY_GENERATE
hassof1082d12005-09-19 04:23:34 +00003235 if (memcmp (area->topology_baseis, DEFAULT_TOPOLOGY_BASEIS,
3236 ISIS_SYS_ID_LEN))
3237 {
3238 vty_out (vty, " topology base-is %s%s",
Josh Bailey3f045a02012-03-24 08:35:20 -07003239 sysid_print ((u_char *)area->topology_baseis), VTY_NEWLINE);
hassof1082d12005-09-19 04:23:34 +00003240 write++;
3241 }
3242 if (area->topology_basedynh)
3243 {
3244 vty_out (vty, " topology base-dynh %s%s",
3245 area->topology_basedynh, VTY_NEWLINE);
3246 write++;
3247 }
3248 /* We save the whole command line here. */
3249 if (strlen(area->top_params))
hassof390d2c2004-09-10 20:48:21 +00003250 {
3251 vty_out (vty, " %s%s", area->top_params, VTY_NEWLINE);
3252 write++;
3253 }
hassof390d2c2004-09-10 20:48:21 +00003254#endif /* TOPOLOGY_GENERATE */
hassof1082d12005-09-19 04:23:34 +00003255
hassof390d2c2004-09-10 20:48:21 +00003256 }
Olivier Dugeon4f593572016-04-19 19:03:05 +02003257 isis_mpls_te_config_write_router(vty);
jardineb5d44e2003-12-23 08:09:43 +00003258 }
hassof390d2c2004-09-10 20:48:21 +00003259
jardineb5d44e2003-12-23 08:09:43 +00003260 return write;
3261}
3262
Josh Bailey3f045a02012-03-24 08:35:20 -07003263struct cmd_node isis_node = {
jardineb5d44e2003-12-23 08:09:43 +00003264 ISIS_NODE,
hasso2097cd82003-12-23 11:51:08 +00003265 "%s(config-router)# ",
jardineb5d44e2003-12-23 08:09:43 +00003266 1
3267};
3268
hassof390d2c2004-09-10 20:48:21 +00003269void
jardineb5d44e2003-12-23 08:09:43 +00003270isis_init ()
3271{
jardineb5d44e2003-12-23 08:09:43 +00003272 /* Install IS-IS top node */
3273 install_node (&isis_node, isis_config_write);
hassof390d2c2004-09-10 20:48:21 +00003274
Josh Bailey3f045a02012-03-24 08:35:20 -07003275 install_element (VIEW_NODE, &show_isis_summary_cmd);
3276
3277 install_element (VIEW_NODE, &show_isis_interface_cmd);
3278 install_element (VIEW_NODE, &show_isis_interface_detail_cmd);
3279 install_element (VIEW_NODE, &show_isis_interface_arg_cmd);
3280
3281 install_element (VIEW_NODE, &show_isis_neighbor_cmd);
3282 install_element (VIEW_NODE, &show_isis_neighbor_detail_cmd);
3283 install_element (VIEW_NODE, &show_isis_neighbor_arg_cmd);
3284 install_element (VIEW_NODE, &clear_isis_neighbor_cmd);
3285 install_element (VIEW_NODE, &clear_isis_neighbor_arg_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003286
3287 install_element (VIEW_NODE, &show_hostname_cmd);
3288 install_element (VIEW_NODE, &show_database_cmd);
Josh Bailey3f045a02012-03-24 08:35:20 -07003289 install_element (VIEW_NODE, &show_database_arg_cmd);
3290 install_element (VIEW_NODE, &show_database_arg_detail_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003291 install_element (VIEW_NODE, &show_database_detail_cmd);
Josh Bailey3f045a02012-03-24 08:35:20 -07003292 install_element (VIEW_NODE, &show_database_detail_arg_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003293
Olivier Dugeon4f593572016-04-19 19:03:05 +02003294 install_element (ENABLE_NODE, &show_debugging_isis_cmd);
3295
hassof390d2c2004-09-10 20:48:21 +00003296 install_node (&debug_node, config_write_debug);
jardin9e867fe2003-12-23 08:56:18 +00003297
jardineb5d44e2003-12-23 08:09:43 +00003298 install_element (ENABLE_NODE, &debug_isis_adj_cmd);
3299 install_element (ENABLE_NODE, &no_debug_isis_adj_cmd);
3300 install_element (ENABLE_NODE, &debug_isis_csum_cmd);
3301 install_element (ENABLE_NODE, &no_debug_isis_csum_cmd);
3302 install_element (ENABLE_NODE, &debug_isis_lupd_cmd);
3303 install_element (ENABLE_NODE, &no_debug_isis_lupd_cmd);
3304 install_element (ENABLE_NODE, &debug_isis_err_cmd);
3305 install_element (ENABLE_NODE, &no_debug_isis_err_cmd);
3306 install_element (ENABLE_NODE, &debug_isis_snp_cmd);
3307 install_element (ENABLE_NODE, &no_debug_isis_snp_cmd);
3308 install_element (ENABLE_NODE, &debug_isis_upd_cmd);
3309 install_element (ENABLE_NODE, &no_debug_isis_upd_cmd);
3310 install_element (ENABLE_NODE, &debug_isis_spfevents_cmd);
3311 install_element (ENABLE_NODE, &no_debug_isis_spfevents_cmd);
3312 install_element (ENABLE_NODE, &debug_isis_spfstats_cmd);
3313 install_element (ENABLE_NODE, &no_debug_isis_spfstats_cmd);
3314 install_element (ENABLE_NODE, &debug_isis_spftrigg_cmd);
3315 install_element (ENABLE_NODE, &no_debug_isis_spftrigg_cmd);
3316 install_element (ENABLE_NODE, &debug_isis_rtevents_cmd);
3317 install_element (ENABLE_NODE, &no_debug_isis_rtevents_cmd);
3318 install_element (ENABLE_NODE, &debug_isis_events_cmd);
3319 install_element (ENABLE_NODE, &no_debug_isis_events_cmd);
Josh Bailey3f045a02012-03-24 08:35:20 -07003320 install_element (ENABLE_NODE, &debug_isis_packet_dump_cmd);
3321 install_element (ENABLE_NODE, &no_debug_isis_packet_dump_cmd);
Christian Franke80a8f722015-11-12 14:21:47 +01003322 install_element (ENABLE_NODE, &debug_isis_lsp_gen_cmd);
3323 install_element (ENABLE_NODE, &no_debug_isis_lsp_gen_cmd);
Christian Franke61010c32015-11-10 18:43:34 +01003324 install_element (ENABLE_NODE, &debug_isis_lsp_sched_cmd);
3325 install_element (ENABLE_NODE, &no_debug_isis_lsp_sched_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003326
jardin9e867fe2003-12-23 08:56:18 +00003327 install_element (CONFIG_NODE, &debug_isis_adj_cmd);
3328 install_element (CONFIG_NODE, &no_debug_isis_adj_cmd);
3329 install_element (CONFIG_NODE, &debug_isis_csum_cmd);
3330 install_element (CONFIG_NODE, &no_debug_isis_csum_cmd);
3331 install_element (CONFIG_NODE, &debug_isis_lupd_cmd);
3332 install_element (CONFIG_NODE, &no_debug_isis_lupd_cmd);
3333 install_element (CONFIG_NODE, &debug_isis_err_cmd);
3334 install_element (CONFIG_NODE, &no_debug_isis_err_cmd);
3335 install_element (CONFIG_NODE, &debug_isis_snp_cmd);
3336 install_element (CONFIG_NODE, &no_debug_isis_snp_cmd);
3337 install_element (CONFIG_NODE, &debug_isis_upd_cmd);
3338 install_element (CONFIG_NODE, &no_debug_isis_upd_cmd);
3339 install_element (CONFIG_NODE, &debug_isis_spfevents_cmd);
3340 install_element (CONFIG_NODE, &no_debug_isis_spfevents_cmd);
3341 install_element (CONFIG_NODE, &debug_isis_spfstats_cmd);
3342 install_element (CONFIG_NODE, &no_debug_isis_spfstats_cmd);
3343 install_element (CONFIG_NODE, &debug_isis_spftrigg_cmd);
3344 install_element (CONFIG_NODE, &no_debug_isis_spftrigg_cmd);
3345 install_element (CONFIG_NODE, &debug_isis_rtevents_cmd);
3346 install_element (CONFIG_NODE, &no_debug_isis_rtevents_cmd);
3347 install_element (CONFIG_NODE, &debug_isis_events_cmd);
3348 install_element (CONFIG_NODE, &no_debug_isis_events_cmd);
Josh Bailey3f045a02012-03-24 08:35:20 -07003349 install_element (CONFIG_NODE, &debug_isis_packet_dump_cmd);
3350 install_element (CONFIG_NODE, &no_debug_isis_packet_dump_cmd);
Christian Franke80a8f722015-11-12 14:21:47 +01003351 install_element (CONFIG_NODE, &debug_isis_lsp_gen_cmd);
3352 install_element (CONFIG_NODE, &no_debug_isis_lsp_gen_cmd);
Christian Franke61010c32015-11-10 18:43:34 +01003353 install_element (CONFIG_NODE, &debug_isis_lsp_sched_cmd);
3354 install_element (CONFIG_NODE, &no_debug_isis_lsp_sched_cmd);
jardin9e867fe2003-12-23 08:56:18 +00003355
jardineb5d44e2003-12-23 08:09:43 +00003356 install_element (CONFIG_NODE, &router_isis_cmd);
3357 install_element (CONFIG_NODE, &no_router_isis_cmd);
3358
3359 install_default (ISIS_NODE);
3360
3361 install_element (ISIS_NODE, &net_cmd);
3362 install_element (ISIS_NODE, &no_net_cmd);
3363
3364 install_element (ISIS_NODE, &is_type_cmd);
3365 install_element (ISIS_NODE, &no_is_type_cmd);
3366
Christian Frankef1fc1db2015-11-10 18:43:31 +01003367 install_element (ISIS_NODE, &area_lsp_mtu_cmd);
3368 install_element (ISIS_NODE, &no_area_lsp_mtu_cmd);
3369 install_element (ISIS_NODE, &no_area_lsp_mtu_arg_cmd);
3370
Josh Bailey3f045a02012-03-24 08:35:20 -07003371 install_element (ISIS_NODE, &area_passwd_md5_cmd);
3372 install_element (ISIS_NODE, &area_passwd_md5_snpauth_cmd);
3373 install_element (ISIS_NODE, &area_passwd_clear_cmd);
3374 install_element (ISIS_NODE, &area_passwd_clear_snpauth_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003375 install_element (ISIS_NODE, &no_area_passwd_cmd);
3376
Josh Bailey3f045a02012-03-24 08:35:20 -07003377 install_element (ISIS_NODE, &domain_passwd_md5_cmd);
3378 install_element (ISIS_NODE, &domain_passwd_md5_snpauth_cmd);
3379 install_element (ISIS_NODE, &domain_passwd_clear_cmd);
3380 install_element (ISIS_NODE, &domain_passwd_clear_snpauth_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003381 install_element (ISIS_NODE, &no_domain_passwd_cmd);
3382
3383 install_element (ISIS_NODE, &lsp_gen_interval_cmd);
3384 install_element (ISIS_NODE, &no_lsp_gen_interval_cmd);
3385 install_element (ISIS_NODE, &no_lsp_gen_interval_arg_cmd);
3386 install_element (ISIS_NODE, &lsp_gen_interval_l1_cmd);
3387 install_element (ISIS_NODE, &no_lsp_gen_interval_l1_cmd);
3388 install_element (ISIS_NODE, &no_lsp_gen_interval_l1_arg_cmd);
3389 install_element (ISIS_NODE, &lsp_gen_interval_l2_cmd);
3390 install_element (ISIS_NODE, &no_lsp_gen_interval_l2_cmd);
3391 install_element (ISIS_NODE, &no_lsp_gen_interval_l2_arg_cmd);
3392
3393 install_element (ISIS_NODE, &spf_interval_cmd);
3394 install_element (ISIS_NODE, &no_spf_interval_cmd);
3395 install_element (ISIS_NODE, &no_spf_interval_arg_cmd);
3396 install_element (ISIS_NODE, &spf_interval_l1_cmd);
3397 install_element (ISIS_NODE, &no_spf_interval_l1_cmd);
3398 install_element (ISIS_NODE, &no_spf_interval_l1_arg_cmd);
3399 install_element (ISIS_NODE, &spf_interval_l2_cmd);
3400 install_element (ISIS_NODE, &no_spf_interval_l2_cmd);
3401 install_element (ISIS_NODE, &no_spf_interval_l2_arg_cmd);
hassof390d2c2004-09-10 20:48:21 +00003402
Josh Bailey3f045a02012-03-24 08:35:20 -07003403 install_element (ISIS_NODE, &max_lsp_lifetime_cmd);
3404 install_element (ISIS_NODE, &no_max_lsp_lifetime_cmd);
3405 install_element (ISIS_NODE, &no_max_lsp_lifetime_arg_cmd);
3406 install_element (ISIS_NODE, &max_lsp_lifetime_l1_cmd);
3407 install_element (ISIS_NODE, &no_max_lsp_lifetime_l1_cmd);
3408 install_element (ISIS_NODE, &no_max_lsp_lifetime_l1_arg_cmd);
3409 install_element (ISIS_NODE, &max_lsp_lifetime_l2_cmd);
3410 install_element (ISIS_NODE, &no_max_lsp_lifetime_l2_cmd);
3411 install_element (ISIS_NODE, &no_max_lsp_lifetime_l2_arg_cmd);
3412
3413 install_element (ISIS_NODE, &lsp_refresh_interval_cmd);
3414 install_element (ISIS_NODE, &no_lsp_refresh_interval_cmd);
3415 install_element (ISIS_NODE, &no_lsp_refresh_interval_arg_cmd);
3416 install_element (ISIS_NODE, &lsp_refresh_interval_l1_cmd);
3417 install_element (ISIS_NODE, &no_lsp_refresh_interval_l1_cmd);
3418 install_element (ISIS_NODE, &no_lsp_refresh_interval_l1_arg_cmd);
3419 install_element (ISIS_NODE, &lsp_refresh_interval_l2_cmd);
3420 install_element (ISIS_NODE, &no_lsp_refresh_interval_l2_cmd);
3421 install_element (ISIS_NODE, &no_lsp_refresh_interval_l2_arg_cmd);
3422
3423 install_element (ISIS_NODE, &set_overload_bit_cmd);
3424 install_element (ISIS_NODE, &no_set_overload_bit_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003425
Amritha Nambiarc8ee9402015-08-24 16:40:14 -07003426 install_element (ISIS_NODE, &set_attached_bit_cmd);
3427 install_element (ISIS_NODE, &no_set_attached_bit_cmd);
3428
jardineb5d44e2003-12-23 08:09:43 +00003429 install_element (ISIS_NODE, &dynamic_hostname_cmd);
3430 install_element (ISIS_NODE, &no_dynamic_hostname_cmd);
3431
3432 install_element (ISIS_NODE, &metric_style_cmd);
3433 install_element (ISIS_NODE, &no_metric_style_cmd);
Josh Bailey3f045a02012-03-24 08:35:20 -07003434
3435 install_element (ISIS_NODE, &log_adj_changes_cmd);
3436 install_element (ISIS_NODE, &no_log_adj_changes_cmd);
3437
jardineb5d44e2003-12-23 08:09:43 +00003438#ifdef TOPOLOGY_GENERATE
3439 install_element (ISIS_NODE, &topology_generate_grid_cmd);
3440 install_element (ISIS_NODE, &topology_baseis_cmd);
hassof1082d12005-09-19 04:23:34 +00003441 install_element (ISIS_NODE, &topology_basedynh_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003442 install_element (ISIS_NODE, &no_topology_baseis_cmd);
hassof1082d12005-09-19 04:23:34 +00003443 install_element (ISIS_NODE, &no_topology_baseis_noid_cmd);
hassof695b012005-04-02 19:03:39 +00003444 install_element (VIEW_NODE, &show_isis_generated_topology_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003445#endif /* TOPOLOGY_GENERATE */
jardineb5d44e2003-12-23 08:09:43 +00003446}