blob: 11f7d234f8bb0a9a67b306cdcb1b0ffeeb2fda1b [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
Christian Frankeccd485d2016-07-28 17:23:26 +02002180void isis_area_metricstyle_set(struct isis_area *area, bool old_metric,
2181 bool new_metric)
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002182{
Christian Frankeccd485d2016-07-28 17:23:26 +02002183 if (area->oldmetric != old_metric
2184 || area->newmetric != new_metric)
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002185 {
Christian Frankeccd485d2016-07-28 17:23:26 +02002186 area->oldmetric = old_metric;
2187 area->newmetric = new_metric;
2188 lsp_regenerate_schedule(area, IS_LEVEL_1 | IS_LEVEL_2, 1);
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002189 }
Christian Frankeccd485d2016-07-28 17:23:26 +02002190}
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002191
Christian Frankeccd485d2016-07-28 17:23:26 +02002192void isis_area_overload_bit_set(struct isis_area *area, bool overload_bit)
2193{
2194 char new_overload_bit = overload_bit ? LSPBIT_OL : 0;
2195
2196 if (new_overload_bit != area->overload_bit)
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002197 {
Christian Frankeccd485d2016-07-28 17:23:26 +02002198 area->overload_bit = new_overload_bit;
2199 lsp_regenerate_schedule(area, IS_LEVEL_1 | IS_LEVEL_2, 1);
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002200 }
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002201}
2202
Christian Frankeccd485d2016-07-28 17:23:26 +02002203void isis_area_attached_bit_set(struct isis_area *area, bool attached_bit)
jardineb5d44e2003-12-23 08:09:43 +00002204{
Christian Frankeccd485d2016-07-28 17:23:26 +02002205 char new_attached_bit = attached_bit ? LSPBIT_ATT : 0;
jardineb5d44e2003-12-23 08:09:43 +00002206
Christian Frankeccd485d2016-07-28 17:23:26 +02002207 if (new_attached_bit != area->attached_bit)
hasso2984d262005-09-26 16:49:07 +00002208 {
Christian Frankeccd485d2016-07-28 17:23:26 +02002209 area->attached_bit = new_attached_bit;
2210 lsp_regenerate_schedule(area, IS_LEVEL_1 | IS_LEVEL_2, 1);
hasso2984d262005-09-26 16:49:07 +00002211 }
Christian Frankeccd485d2016-07-28 17:23:26 +02002212}
2213
2214void isis_area_dynhostname_set(struct isis_area *area, bool dynhostname)
2215{
2216 if (area->dynhostname != dynhostname)
hasso2984d262005-09-26 16:49:07 +00002217 {
Christian Frankeccd485d2016-07-28 17:23:26 +02002218 area->dynhostname = dynhostname;
2219 lsp_regenerate_schedule(area, IS_LEVEL_1 | IS_LEVEL_2, 0);
hasso2984d262005-09-26 16:49:07 +00002220 }
jardineb5d44e2003-12-23 08:09:43 +00002221}
2222
2223DEFUN (spf_interval,
2224 spf_interval_cmd,
2225 "spf-interval <1-120>",
hasso2097cd82003-12-23 11:51:08 +00002226 "Minimum interval between SPF calculations\n"
jardineb5d44e2003-12-23 08:09:43 +00002227 "Minimum interval between consecutive SPFs in seconds\n")
2228{
2229 struct isis_area *area;
2230 u_int16_t interval;
hassof390d2c2004-09-10 20:48:21 +00002231
jardineb5d44e2003-12-23 08:09:43 +00002232 area = vty->index;
2233 interval = atoi (argv[0]);
2234 area->min_spf_interval[0] = interval;
2235 area->min_spf_interval[1] = interval;
hassof390d2c2004-09-10 20:48:21 +00002236
jardineb5d44e2003-12-23 08:09:43 +00002237 return CMD_SUCCESS;
2238}
2239
2240DEFUN (no_spf_interval,
2241 no_spf_interval_cmd,
2242 "no spf-interval",
2243 NO_STR
hassof390d2c2004-09-10 20:48:21 +00002244 "Minimum interval between SPF calculations\n")
jardineb5d44e2003-12-23 08:09:43 +00002245{
2246 struct isis_area *area;
hassof390d2c2004-09-10 20:48:21 +00002247
jardineb5d44e2003-12-23 08:09:43 +00002248 area = vty->index;
2249
2250 area->min_spf_interval[0] = MINIMUM_SPF_INTERVAL;
2251 area->min_spf_interval[1] = MINIMUM_SPF_INTERVAL;
hassof390d2c2004-09-10 20:48:21 +00002252
jardineb5d44e2003-12-23 08:09:43 +00002253 return CMD_SUCCESS;
2254}
2255
2256ALIAS (no_spf_interval,
2257 no_spf_interval_arg_cmd,
2258 "no spf-interval <1-120>",
2259 NO_STR
2260 "Minimum interval between SPF calculations\n"
hassof390d2c2004-09-10 20:48:21 +00002261 "Minimum interval between consecutive SPFs in seconds\n")
jardineb5d44e2003-12-23 08:09:43 +00002262
2263DEFUN (spf_interval_l1,
2264 spf_interval_l1_cmd,
2265 "spf-interval level-1 <1-120>",
2266 "Minimum interval between SPF calculations\n"
2267 "Set interval for level 1 only\n"
2268 "Minimum interval between consecutive SPFs in seconds\n")
2269{
2270 struct isis_area *area;
2271 u_int16_t interval;
hassof390d2c2004-09-10 20:48:21 +00002272
jardineb5d44e2003-12-23 08:09:43 +00002273 area = vty->index;
2274 interval = atoi (argv[0]);
2275 area->min_spf_interval[0] = interval;
hassof390d2c2004-09-10 20:48:21 +00002276
jardineb5d44e2003-12-23 08:09:43 +00002277 return CMD_SUCCESS;
2278}
2279
2280DEFUN (no_spf_interval_l1,
2281 no_spf_interval_l1_cmd,
2282 "no spf-interval level-1",
2283 NO_STR
2284 "Minimum interval between SPF calculations\n"
2285 "Set interval for level 1 only\n")
2286{
2287 struct isis_area *area;
hassof390d2c2004-09-10 20:48:21 +00002288
jardineb5d44e2003-12-23 08:09:43 +00002289 area = vty->index;
2290
2291 area->min_spf_interval[0] = MINIMUM_SPF_INTERVAL;
hassof390d2c2004-09-10 20:48:21 +00002292
jardineb5d44e2003-12-23 08:09:43 +00002293 return CMD_SUCCESS;
2294}
2295
2296ALIAS (no_spf_interval,
2297 no_spf_interval_l1_arg_cmd,
2298 "no spf-interval level-1 <1-120>",
2299 NO_STR
2300 "Minimum interval between SPF calculations\n"
2301 "Set interval for level 1 only\n"
2302 "Minimum interval between consecutive SPFs in seconds\n")
2303
2304DEFUN (spf_interval_l2,
2305 spf_interval_l2_cmd,
2306 "spf-interval level-2 <1-120>",
2307 "Minimum interval between SPF calculations\n"
2308 "Set interval for level 2 only\n"
2309 "Minimum interval between consecutive SPFs in seconds\n")
2310{
2311 struct isis_area *area;
2312 u_int16_t interval;
hassof390d2c2004-09-10 20:48:21 +00002313
jardineb5d44e2003-12-23 08:09:43 +00002314 area = vty->index;
2315 interval = atoi (argv[0]);
2316 area->min_spf_interval[1] = interval;
hassof390d2c2004-09-10 20:48:21 +00002317
jardineb5d44e2003-12-23 08:09:43 +00002318 return CMD_SUCCESS;
2319}
2320
2321DEFUN (no_spf_interval_l2,
2322 no_spf_interval_l2_cmd,
2323 "no spf-interval level-2",
2324 NO_STR
2325 "Minimum interval between SPF calculations\n"
2326 "Set interval for level 2 only\n")
2327{
2328 struct isis_area *area;
hassof390d2c2004-09-10 20:48:21 +00002329
jardineb5d44e2003-12-23 08:09:43 +00002330 area = vty->index;
2331
2332 area->min_spf_interval[1] = MINIMUM_SPF_INTERVAL;
hassof390d2c2004-09-10 20:48:21 +00002333
jardineb5d44e2003-12-23 08:09:43 +00002334 return CMD_SUCCESS;
2335}
2336
2337ALIAS (no_spf_interval,
2338 no_spf_interval_l2_arg_cmd,
2339 "no spf-interval level-2 <1-120>",
2340 NO_STR
2341 "Minimum interval between SPF calculations\n"
2342 "Set interval for level 2 only\n"
2343 "Minimum interval between consecutive SPFs in seconds\n")
2344
Josh Bailey3f045a02012-03-24 08:35:20 -07002345static int
2346set_lsp_max_lifetime (struct vty *vty, struct isis_area *area,
2347 uint16_t interval, int level)
2348{
2349 int lvl;
2350 int set_refresh_interval[ISIS_LEVELS] = {0, 0};
2351 uint16_t refresh_interval;
2352
2353 refresh_interval = interval - 300;
2354
2355 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; lvl++)
2356 {
2357 if (!(lvl & level))
2358 continue;
2359 if (refresh_interval < area->lsp_refresh[lvl-1])
2360 {
2361 vty_out (vty, "Level %d Max LSP lifetime %us must be 300s greater than "
2362 "the configured LSP refresh interval %us%s",
2363 lvl, interval, area->lsp_refresh[lvl-1], VTY_NEWLINE);
2364 vty_out (vty, "Automatically reducing level %d LSP refresh interval "
2365 "to %us%s", lvl, refresh_interval, VTY_NEWLINE);
2366 set_refresh_interval[lvl-1] = 1;
2367
2368 if (refresh_interval <= area->lsp_gen_interval[lvl-1])
2369 {
2370 vty_out (vty, "LSP refresh interval %us must be greater than "
2371 "the configured LSP gen interval %us%s",
2372 refresh_interval, area->lsp_gen_interval[lvl-1],
2373 VTY_NEWLINE);
2374 return CMD_ERR_AMBIGUOUS;
2375 }
2376 }
2377 }
2378
2379 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; lvl++)
2380 {
2381 if (!(lvl & level))
2382 continue;
2383 area->max_lsp_lifetime[lvl-1] = interval;
2384 /* Automatically reducing lsp_refresh_interval to interval - 300 */
2385 if (set_refresh_interval[lvl-1])
2386 area->lsp_refresh[lvl-1] = refresh_interval;
2387 }
2388
2389 lsp_regenerate_schedule (area, level, 1);
2390
2391 return CMD_SUCCESS;
2392}
2393
2394DEFUN (max_lsp_lifetime,
2395 max_lsp_lifetime_cmd,
2396 "max-lsp-lifetime <350-65535>",
2397 "Maximum LSP lifetime\n"
2398 "LSP lifetime in seconds\n")
2399{
2400 struct isis_area *area;
2401 uint16_t interval;
2402 int level;
2403
2404 area = vty->index;
2405 interval = atoi (argv[0]);
2406 level = IS_LEVEL_1 | IS_LEVEL_2;
2407 return set_lsp_max_lifetime (vty, area, interval, level);
2408}
2409
2410DEFUN (no_max_lsp_lifetime,
2411 no_max_lsp_lifetime_cmd,
2412 "no max-lsp-lifetime",
2413 NO_STR
2414 "LSP lifetime in seconds\n")
2415{
2416 struct isis_area *area;
2417 uint16_t interval;
2418 int level;
2419
2420 area = vty->index;
2421 interval = DEFAULT_LSP_LIFETIME;
2422 level = IS_LEVEL_1 | IS_LEVEL_2;
2423 return set_lsp_max_lifetime (vty, area, interval, level);
2424}
2425
2426ALIAS (no_max_lsp_lifetime,
2427 no_max_lsp_lifetime_arg_cmd,
2428 "no max-lsp-lifetime <350-65535>",
2429 NO_STR
2430 "Maximum LSP lifetime\n"
2431 "LSP lifetime in seconds\n")
2432
2433DEFUN (max_lsp_lifetime_l1,
2434 max_lsp_lifetime_l1_cmd,
2435 "max-lsp-lifetime level-1 <350-65535>",
2436 "Maximum LSP lifetime for Level 1 only\n"
2437 "LSP lifetime for Level 1 only in seconds\n")
2438{
2439 struct isis_area *area;
2440 uint16_t interval;
2441 int level;
2442
2443 area = vty->index;
2444 interval = atoi (argv[0]);
2445 level = IS_LEVEL_1;
2446 return set_lsp_max_lifetime (vty, area, interval, level);
2447}
2448
2449DEFUN (no_max_lsp_lifetime_l1,
2450 no_max_lsp_lifetime_l1_cmd,
2451 "no max-lsp-lifetime level-1",
2452 NO_STR
2453 "LSP lifetime for Level 1 only in seconds\n")
2454{
2455 struct isis_area *area;
2456 uint16_t interval;
2457 int level;
2458
2459 area = vty->index;
2460 interval = DEFAULT_LSP_LIFETIME;
2461 level = IS_LEVEL_1;
2462 return set_lsp_max_lifetime (vty, area, interval, level);
2463}
2464
2465ALIAS (no_max_lsp_lifetime_l1,
2466 no_max_lsp_lifetime_l1_arg_cmd,
2467 "no max-lsp-lifetime level-1 <350-65535>",
2468 NO_STR
2469 "Maximum LSP lifetime for Level 1 only\n"
2470 "LSP lifetime for Level 1 only in seconds\n")
2471
2472DEFUN (max_lsp_lifetime_l2,
2473 max_lsp_lifetime_l2_cmd,
2474 "max-lsp-lifetime level-2 <350-65535>",
2475 "Maximum LSP lifetime for Level 2 only\n"
2476 "LSP lifetime for Level 2 only in seconds\n")
2477{
2478 struct isis_area *area;
2479 uint16_t interval;
2480 int level;
2481
2482 area = vty->index;
2483 interval = atoi (argv[0]);
2484 level = IS_LEVEL_2;
2485 return set_lsp_max_lifetime (vty, area, interval, level);
2486}
2487
2488DEFUN (no_max_lsp_lifetime_l2,
2489 no_max_lsp_lifetime_l2_cmd,
2490 "no max-lsp-lifetime level-2",
2491 NO_STR
2492 "LSP lifetime for Level 2 only in seconds\n")
2493{
2494 struct isis_area *area;
2495 uint16_t interval;
2496 int level;
2497
2498 area = vty->index;
2499 interval = DEFAULT_LSP_LIFETIME;
2500 level = IS_LEVEL_2;
2501 return set_lsp_max_lifetime (vty, area, interval, level);
2502}
2503
2504ALIAS (no_max_lsp_lifetime_l2,
2505 no_max_lsp_lifetime_l2_arg_cmd,
2506 "no max-lsp-lifetime level-2 <350-65535>",
2507 NO_STR
2508 "Maximum LSP lifetime for Level 2 only\n"
2509 "LSP lifetime for Level 2 only in seconds\n")
2510
2511static int
2512set_lsp_refresh_interval (struct vty *vty, struct isis_area *area,
2513 uint16_t interval, int level)
2514{
2515 int lvl;
2516
2517 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl)
2518 {
2519 if (!(lvl & level))
2520 continue;
2521 if (interval <= area->lsp_gen_interval[lvl-1])
2522 {
2523 vty_out (vty, "LSP refresh interval %us must be greater than "
2524 "the configured LSP gen interval %us%s",
2525 interval, area->lsp_gen_interval[lvl-1],
2526 VTY_NEWLINE);
2527 return CMD_ERR_AMBIGUOUS;
2528 }
2529 if (interval > (area->max_lsp_lifetime[lvl-1] - 300))
2530 {
2531 vty_out (vty, "LSP refresh interval %us must be less than "
2532 "the configured LSP lifetime %us less 300%s",
2533 interval, area->max_lsp_lifetime[lvl-1],
2534 VTY_NEWLINE);
2535 return CMD_ERR_AMBIGUOUS;
2536 }
2537 }
2538
2539 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl)
2540 {
2541 if (!(lvl & level))
2542 continue;
2543 area->lsp_refresh[lvl-1] = interval;
2544 }
2545 lsp_regenerate_schedule (area, level, 1);
2546
2547 return CMD_SUCCESS;
2548}
2549
2550DEFUN (lsp_refresh_interval,
2551 lsp_refresh_interval_cmd,
2552 "lsp-refresh-interval <1-65235>",
2553 "LSP refresh interval\n"
2554 "LSP refresh interval in seconds\n")
2555{
2556 struct isis_area *area;
2557 uint16_t interval;
2558 int level;
2559
2560 area = vty->index;
2561 interval = atoi (argv[0]);
2562 level = IS_LEVEL_1 | IS_LEVEL_2;
2563 return set_lsp_refresh_interval (vty, area, interval, level);
2564}
2565
2566DEFUN (no_lsp_refresh_interval,
2567 no_lsp_refresh_interval_cmd,
2568 "no lsp-refresh-interval",
2569 NO_STR
2570 "LSP refresh interval in seconds\n")
2571{
2572 struct isis_area *area;
2573 uint16_t interval;
2574 int level;
2575
2576 area = vty->index;
2577 interval = DEFAULT_MAX_LSP_GEN_INTERVAL;
2578 level = IS_LEVEL_1 | IS_LEVEL_2;
2579 return set_lsp_refresh_interval (vty, area, interval, level);
2580}
2581
2582ALIAS (no_lsp_refresh_interval,
2583 no_lsp_refresh_interval_arg_cmd,
2584 "no lsp-refresh-interval <1-65235>",
2585 NO_STR
2586 "LSP refresh interval\n"
2587 "LSP refresh interval in seconds\n")
2588
2589DEFUN (lsp_refresh_interval_l1,
2590 lsp_refresh_interval_l1_cmd,
2591 "lsp-refresh-interval level-1 <1-65235>",
2592 "LSP refresh interval for Level 1 only\n"
2593 "LSP refresh interval for Level 1 only in seconds\n")
2594{
2595 struct isis_area *area;
2596 uint16_t interval;
2597 int level;
2598
2599 area = vty->index;
2600 interval = atoi (argv[0]);
2601 level = IS_LEVEL_1;
2602 return set_lsp_refresh_interval (vty, area, interval, level);
2603}
2604
2605DEFUN (no_lsp_refresh_interval_l1,
2606 no_lsp_refresh_interval_l1_cmd,
2607 "no lsp-refresh-interval level-1",
2608 NO_STR
2609 "LSP refresh interval for Level 1 only in seconds\n")
2610{
2611 struct isis_area *area;
2612 uint16_t interval;
2613 int level;
2614
2615 area = vty->index;
2616 interval = DEFAULT_MAX_LSP_GEN_INTERVAL;
2617 level = IS_LEVEL_1;
2618 return set_lsp_refresh_interval (vty, area, interval, level);
2619}
2620
2621ALIAS (no_lsp_refresh_interval_l1,
2622 no_lsp_refresh_interval_l1_arg_cmd,
2623 "no lsp-refresh-interval level-1 <1-65235>",
2624 NO_STR
2625 "LSP refresh interval for Level 1 only\n"
2626 "LSP refresh interval for Level 1 only in seconds\n")
2627
2628DEFUN (lsp_refresh_interval_l2,
2629 lsp_refresh_interval_l2_cmd,
2630 "lsp-refresh-interval level-2 <1-65235>",
2631 "LSP refresh interval for Level 2 only\n"
2632 "LSP refresh interval for Level 2 only in seconds\n")
2633{
2634 struct isis_area *area;
2635 uint16_t interval;
2636 int level;
2637
2638 area = vty->index;
2639 interval = atoi (argv[0]);
2640 level = IS_LEVEL_2;
2641 return set_lsp_refresh_interval (vty, area, interval, level);
2642}
2643
2644DEFUN (no_lsp_refresh_interval_l2,
2645 no_lsp_refresh_interval_l2_cmd,
2646 "no lsp-refresh-interval level-2",
2647 NO_STR
2648 "LSP refresh interval for Level 2 only in seconds\n")
2649{
2650 struct isis_area *area;
2651 uint16_t interval;
2652 int level;
2653
2654 area = vty->index;
2655 interval = DEFAULT_MAX_LSP_GEN_INTERVAL;
2656 level = IS_LEVEL_2;
2657 return set_lsp_refresh_interval (vty, area, interval, level);
2658}
2659
2660ALIAS (no_lsp_refresh_interval_l2,
2661 no_lsp_refresh_interval_l2_arg_cmd,
2662 "no lsp-refresh-interval level-2 <1-65235>",
2663 NO_STR
2664 "LSP refresh interval for Level 2 only\n"
2665 "LSP refresh interval for Level 2 only in seconds\n")
2666
2667DEFUN (log_adj_changes,
2668 log_adj_changes_cmd,
2669 "log-adjacency-changes",
2670 "Log changes in adjacency state\n")
2671{
2672 struct isis_area *area;
2673
2674 area = vty->index;
2675 assert (area);
2676
2677 area->log_adj_changes = 1;
2678
2679 return CMD_SUCCESS;
2680}
2681
2682DEFUN (no_log_adj_changes,
2683 no_log_adj_changes_cmd,
2684 "no log-adjacency-changes",
2685 "Stop logging changes in adjacency state\n")
2686{
2687 struct isis_area *area;
2688
2689 area = vty->index;
2690 assert (area);
2691
2692 area->log_adj_changes = 0;
2693
2694 return CMD_SUCCESS;
2695}
2696
jardineb5d44e2003-12-23 08:09:43 +00002697#ifdef TOPOLOGY_GENERATE
Josh Bailey3f045a02012-03-24 08:35:20 -07002698
jardineb5d44e2003-12-23 08:09:43 +00002699DEFUN (topology_generate_grid,
2700 topology_generate_grid_cmd,
2701 "topology generate grid <1-100> <1-100> <1-65000> [param] [param] "
2702 "[param]",
hassof1082d12005-09-19 04:23:34 +00002703 "Topology generation for IS-IS\n"
2704 "Topology generation\n"
2705 "Grid topology\n"
jardineb5d44e2003-12-23 08:09:43 +00002706 "X parameter of the grid\n"
2707 "Y parameter of the grid\n"
2708 "Random seed\n"
2709 "Optional param 1\n"
2710 "Optional param 2\n"
2711 "Optional param 3\n"
2712 "Topology\n")
2713{
2714 struct isis_area *area;
2715
2716 area = vty->index;
2717 assert (area);
2718
hassof390d2c2004-09-10 20:48:21 +00002719 if (!spgrid_check_params (vty, argc, argv))
2720 {
2721 if (area->topology)
2722 list_delete (area->topology);
2723 area->topology = list_new ();
2724 memcpy (area->top_params, vty->buf, 200);
2725 gen_spgrid_topology (vty, area->topology);
2726 remove_topology_lsps (area);
2727 generate_topology_lsps (area);
hassof1082d12005-09-19 04:23:34 +00002728 /* Regenerate L1 LSP to get two way connection to the generated
2729 * topology. */
Josh Bailey3f045a02012-03-24 08:35:20 -07002730 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
hassof390d2c2004-09-10 20:48:21 +00002731 }
jardineb5d44e2003-12-23 08:09:43 +00002732
2733 return CMD_SUCCESS;
2734}
2735
hassof695b012005-04-02 19:03:39 +00002736DEFUN (show_isis_generated_topology,
2737 show_isis_generated_topology_cmd,
hassof1082d12005-09-19 04:23:34 +00002738 "show isis generated-topologies",
jardineb5d44e2003-12-23 08:09:43 +00002739 SHOW_STR
Josh Bailey3f045a02012-03-24 08:35:20 -07002740 "ISIS network information\n"
hassof1082d12005-09-19 04:23:34 +00002741 "Show generated topologies\n")
jardineb5d44e2003-12-23 08:09:43 +00002742{
2743 struct isis_area *area;
paul92c9f222005-05-25 12:21:13 +00002744 struct listnode *node;
jardineb5d44e2003-12-23 08:09:43 +00002745 struct listnode *node2;
2746 struct arc *arc;
hassof1082d12005-09-19 04:23:34 +00002747
paul92c9f222005-05-25 12:21:13 +00002748 for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
hassof1082d12005-09-19 04:23:34 +00002749 {
2750 if (!area->topology)
2751 continue;
2752
2753 vty_out (vty, "Topology for isis area: %s%s", area->area_tag,
2754 VTY_NEWLINE);
2755 vty_out (vty, "From node To node Distance%s", VTY_NEWLINE);
2756
2757 for (ALL_LIST_ELEMENTS_RO (area->topology, node2, arc))
2758 vty_out (vty, "%9ld %11ld %12ld%s", arc->from_node, arc->to_node,
2759 arc->distance, VTY_NEWLINE);
2760 }
jardineb5d44e2003-12-23 08:09:43 +00002761 return CMD_SUCCESS;
2762}
2763
hassof1082d12005-09-19 04:23:34 +00002764/* Base IS for topology generation. */
hassof390d2c2004-09-10 20:48:21 +00002765DEFUN (topology_baseis,
jardineb5d44e2003-12-23 08:09:43 +00002766 topology_baseis_cmd,
2767 "topology base-is WORD",
hassof1082d12005-09-19 04:23:34 +00002768 "Topology generation for IS-IS\n"
2769 "A Network IS Base for this topology\n"
2770 "XXXX.XXXX.XXXX Network entity title (NET)\n")
jardineb5d44e2003-12-23 08:09:43 +00002771{
2772 struct isis_area *area;
2773 u_char buff[ISIS_SYS_ID_LEN];
2774
2775 area = vty->index;
2776 assert (area);
2777
hassof390d2c2004-09-10 20:48:21 +00002778 if (sysid2buff (buff, argv[0]))
hassof1082d12005-09-19 04:23:34 +00002779 sysid2buff (area->topology_baseis, argv[0]);
hassof390d2c2004-09-10 20:48:21 +00002780
jardineb5d44e2003-12-23 08:09:43 +00002781 return CMD_SUCCESS;
2782}
2783
jardineb5d44e2003-12-23 08:09:43 +00002784DEFUN (no_topology_baseis,
2785 no_topology_baseis_cmd,
2786 "no topology base-is WORD",
2787 NO_STR
hassof1082d12005-09-19 04:23:34 +00002788 "Topology generation for IS-IS\n"
2789 "A Network IS Base for this topology\n"
2790 "XXXX.XXXX.XXXX Network entity title (NET)\n")
jardineb5d44e2003-12-23 08:09:43 +00002791{
2792 struct isis_area *area;
2793
2794 area = vty->index;
2795 assert (area);
2796
hassof390d2c2004-09-10 20:48:21 +00002797 memcpy (area->topology_baseis, DEFAULT_TOPOLOGY_BASEIS, ISIS_SYS_ID_LEN);
jardineb5d44e2003-12-23 08:09:43 +00002798 return CMD_SUCCESS;
2799}
2800
hassof1082d12005-09-19 04:23:34 +00002801ALIAS (no_topology_baseis,
2802 no_topology_baseis_noid_cmd,
2803 "no topology base-is",
2804 NO_STR
2805 "Topology generation for IS-IS\n"
2806 "A Network IS Base for this topology\n")
2807
2808DEFUN (topology_basedynh,
2809 topology_basedynh_cmd,
2810 "topology base-dynh WORD",
2811 "Topology generation for IS-IS\n"
2812 "Dynamic hostname base for this topology\n"
2813 "Dynamic hostname base\n")
2814{
2815 struct isis_area *area;
2816
2817 area = vty->index;
2818 assert (area);
2819
2820 /* I hope that it's enough. */
2821 area->topology_basedynh = strndup (argv[0], 16);
2822 return CMD_SUCCESS;
2823}
Josh Bailey3f045a02012-03-24 08:35:20 -07002824
jardineb5d44e2003-12-23 08:09:43 +00002825#endif /* TOPOLOGY_GENERATE */
2826
jardineb5d44e2003-12-23 08:09:43 +00002827/* IS-IS configuration write function */
2828int
2829isis_config_write (struct vty *vty)
2830{
2831 int write = 0;
jardineb5d44e2003-12-23 08:09:43 +00002832
hassof390d2c2004-09-10 20:48:21 +00002833 if (isis != NULL)
2834 {
2835 struct isis_area *area;
hasso3fdb2dd2005-09-28 18:45:54 +00002836 struct listnode *node, *node2;
jardineb5d44e2003-12-23 08:09:43 +00002837
hasso3fdb2dd2005-09-28 18:45:54 +00002838 for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
hassof390d2c2004-09-10 20:48:21 +00002839 {
2840 /* ISIS - Area name */
2841 vty_out (vty, "router isis %s%s", area->area_tag, VTY_NEWLINE);
2842 write++;
2843 /* ISIS - Net */
2844 if (listcount (area->area_addrs) > 0)
2845 {
2846 struct area_addr *area_addr;
hasso3fdb2dd2005-09-28 18:45:54 +00002847 for (ALL_LIST_ELEMENTS_RO (area->area_addrs, node2, area_addr))
2848 {
2849 vty_out (vty, " net %s%s",
2850 isonet_print (area_addr->area_addr,
2851 area_addr->addr_len + ISIS_SYS_ID_LEN +
2852 1), VTY_NEWLINE);
2853 write++;
2854 }
hassof390d2c2004-09-10 20:48:21 +00002855 }
hasso3fdb2dd2005-09-28 18:45:54 +00002856 /* ISIS - Dynamic hostname - Defaults to true so only display if
2857 * false. */
hassof390d2c2004-09-10 20:48:21 +00002858 if (!area->dynhostname)
2859 {
2860 vty_out (vty, " no hostname dynamic%s", VTY_NEWLINE);
2861 write++;
2862 }
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002863 /* ISIS - Metric-Style - when true displays wide */
2864 if (area->newmetric)
hassof390d2c2004-09-10 20:48:21 +00002865 {
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002866 if (!area->oldmetric)
2867 vty_out (vty, " metric-style wide%s", VTY_NEWLINE);
hasso2984d262005-09-26 16:49:07 +00002868 else
2869 vty_out (vty, " metric-style transition%s", VTY_NEWLINE);
hassof390d2c2004-09-10 20:48:21 +00002870 write++;
2871 }
Christian Frankef818c8f2012-11-27 01:10:28 +00002872 else
2873 {
2874 vty_out (vty, " metric-style narrow%s", VTY_NEWLINE);
2875 write++;
2876 }
Josh Bailey3f045a02012-03-24 08:35:20 -07002877 /* ISIS - overload-bit */
2878 if (area->overload_bit)
2879 {
2880 vty_out (vty, " set-overload-bit%s", VTY_NEWLINE);
2881 write++;
2882 }
hassof390d2c2004-09-10 20:48:21 +00002883 /* ISIS - Area is-type (level-1-2 is default) */
2884 if (area->is_type == IS_LEVEL_1)
2885 {
2886 vty_out (vty, " is-type level-1%s", VTY_NEWLINE);
2887 write++;
2888 }
Josh Bailey3f045a02012-03-24 08:35:20 -07002889 else if (area->is_type == IS_LEVEL_2)
hassof390d2c2004-09-10 20:48:21 +00002890 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002891 vty_out (vty, " is-type level-2-only%s", VTY_NEWLINE);
2892 write++;
hassof390d2c2004-09-10 20:48:21 +00002893 }
Christian Frankeacf98652015-11-12 14:24:22 +01002894 write += isis_redist_config_write(vty, area, AF_INET);
2895 write += isis_redist_config_write(vty, area, AF_INET6);
hassof390d2c2004-09-10 20:48:21 +00002896 /* ISIS - Lsp generation interval */
2897 if (area->lsp_gen_interval[0] == area->lsp_gen_interval[1])
2898 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002899 if (area->lsp_gen_interval[0] != DEFAULT_MIN_LSP_GEN_INTERVAL)
hassof390d2c2004-09-10 20:48:21 +00002900 {
2901 vty_out (vty, " lsp-gen-interval %d%s",
2902 area->lsp_gen_interval[0], VTY_NEWLINE);
2903 write++;
2904 }
2905 }
2906 else
2907 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002908 if (area->lsp_gen_interval[0] != DEFAULT_MIN_LSP_GEN_INTERVAL)
hassof390d2c2004-09-10 20:48:21 +00002909 {
2910 vty_out (vty, " lsp-gen-interval level-1 %d%s",
2911 area->lsp_gen_interval[0], VTY_NEWLINE);
2912 write++;
2913 }
Josh Bailey3f045a02012-03-24 08:35:20 -07002914 if (area->lsp_gen_interval[1] != DEFAULT_MIN_LSP_GEN_INTERVAL)
hassof390d2c2004-09-10 20:48:21 +00002915 {
2916 vty_out (vty, " lsp-gen-interval level-2 %d%s",
2917 area->lsp_gen_interval[1], VTY_NEWLINE);
2918 write++;
2919 }
2920 }
2921 /* ISIS - LSP lifetime */
2922 if (area->max_lsp_lifetime[0] == area->max_lsp_lifetime[1])
2923 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002924 if (area->max_lsp_lifetime[0] != DEFAULT_LSP_LIFETIME)
hassof390d2c2004-09-10 20:48:21 +00002925 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002926 vty_out (vty, " max-lsp-lifetime %u%s", area->max_lsp_lifetime[0],
hassof390d2c2004-09-10 20:48:21 +00002927 VTY_NEWLINE);
2928 write++;
2929 }
2930 }
2931 else
2932 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002933 if (area->max_lsp_lifetime[0] != DEFAULT_LSP_LIFETIME)
hassof390d2c2004-09-10 20:48:21 +00002934 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002935 vty_out (vty, " max-lsp-lifetime level-1 %u%s",
hassof390d2c2004-09-10 20:48:21 +00002936 area->max_lsp_lifetime[0], VTY_NEWLINE);
2937 write++;
2938 }
Josh Bailey3f045a02012-03-24 08:35:20 -07002939 if (area->max_lsp_lifetime[1] != DEFAULT_LSP_LIFETIME)
hassof390d2c2004-09-10 20:48:21 +00002940 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002941 vty_out (vty, " max-lsp-lifetime level-2 %u%s",
hassof390d2c2004-09-10 20:48:21 +00002942 area->max_lsp_lifetime[1], VTY_NEWLINE);
2943 write++;
2944 }
2945 }
Josh Bailey3f045a02012-03-24 08:35:20 -07002946 /* ISIS - LSP refresh interval */
2947 if (area->lsp_refresh[0] == area->lsp_refresh[1])
2948 {
2949 if (area->lsp_refresh[0] != DEFAULT_MAX_LSP_GEN_INTERVAL)
2950 {
2951 vty_out (vty, " lsp-refresh-interval %u%s", area->lsp_refresh[0],
2952 VTY_NEWLINE);
2953 write++;
2954 }
2955 }
2956 else
2957 {
2958 if (area->lsp_refresh[0] != DEFAULT_MAX_LSP_GEN_INTERVAL)
2959 {
2960 vty_out (vty, " lsp-refresh-interval level-1 %u%s",
2961 area->lsp_refresh[0], VTY_NEWLINE);
2962 write++;
2963 }
2964 if (area->lsp_refresh[1] != DEFAULT_MAX_LSP_GEN_INTERVAL)
2965 {
2966 vty_out (vty, " lsp-refresh-interval level-2 %u%s",
2967 area->lsp_refresh[1], VTY_NEWLINE);
2968 write++;
2969 }
2970 }
Christian Frankef1fc1db2015-11-10 18:43:31 +01002971 if (area->lsp_mtu != DEFAULT_LSP_MTU)
2972 {
2973 vty_out(vty, " lsp-mtu %u%s", area->lsp_mtu, VTY_NEWLINE);
2974 write++;
2975 }
2976
hasso13fb40a2005-10-01 06:03:04 +00002977 /* Minimum SPF interval. */
2978 if (area->min_spf_interval[0] == area->min_spf_interval[1])
2979 {
2980 if (area->min_spf_interval[0] != MINIMUM_SPF_INTERVAL)
2981 {
2982 vty_out (vty, " spf-interval %d%s",
2983 area->min_spf_interval[0], VTY_NEWLINE);
2984 write++;
2985 }
2986 }
2987 else
2988 {
2989 if (area->min_spf_interval[0] != MINIMUM_SPF_INTERVAL)
2990 {
2991 vty_out (vty, " spf-interval level-1 %d%s",
2992 area->min_spf_interval[0], VTY_NEWLINE);
2993 write++;
2994 }
2995 if (area->min_spf_interval[1] != MINIMUM_SPF_INTERVAL)
2996 {
2997 vty_out (vty, " spf-interval level-2 %d%s",
2998 area->min_spf_interval[1], VTY_NEWLINE);
2999 write++;
3000 }
3001 }
hasso53c997c2004-09-15 16:21:59 +00003002 /* Authentication passwords. */
Josh Bailey3f045a02012-03-24 08:35:20 -07003003 if (area->area_passwd.type == ISIS_PASSWD_TYPE_HMAC_MD5)
hasso53c997c2004-09-15 16:21:59 +00003004 {
Josh Bailey3f045a02012-03-24 08:35:20 -07003005 vty_out(vty, " area-password md5 %s", area->area_passwd.passwd);
hasso1cbc5622005-01-01 10:29:51 +00003006 if (CHECK_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND))
3007 {
3008 vty_out(vty, " authenticate snp ");
3009 if (CHECK_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV))
3010 vty_out(vty, "validate");
3011 else
3012 vty_out(vty, "send-only");
3013 }
3014 vty_out(vty, "%s", VTY_NEWLINE);
hasso53c997c2004-09-15 16:21:59 +00003015 write++;
Josh Bailey3f045a02012-03-24 08:35:20 -07003016 }
3017 else if (area->area_passwd.type == ISIS_PASSWD_TYPE_CLEARTXT)
3018 {
3019 vty_out(vty, " area-password clear %s", area->area_passwd.passwd);
3020 if (CHECK_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND))
3021 {
3022 vty_out(vty, " authenticate snp ");
3023 if (CHECK_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV))
3024 vty_out(vty, "validate");
3025 else
3026 vty_out(vty, "send-only");
3027 }
3028 vty_out(vty, "%s", VTY_NEWLINE);
3029 write++;
3030 }
3031 if (area->domain_passwd.type == ISIS_PASSWD_TYPE_HMAC_MD5)
hasso53c997c2004-09-15 16:21:59 +00003032 {
Josh Bailey3f045a02012-03-24 08:35:20 -07003033 vty_out(vty, " domain-password md5 %s",
3034 area->domain_passwd.passwd);
3035 if (CHECK_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND))
3036 {
3037 vty_out(vty, " authenticate snp ");
3038 if (CHECK_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV))
3039 vty_out(vty, "validate");
3040 else
3041 vty_out(vty, "send-only");
3042 }
3043 vty_out(vty, "%s", VTY_NEWLINE);
3044 write++;
3045 }
3046 else if (area->domain_passwd.type == ISIS_PASSWD_TYPE_CLEARTXT)
3047 {
3048 vty_out(vty, " domain-password clear %s",
3049 area->domain_passwd.passwd);
hasso1cbc5622005-01-01 10:29:51 +00003050 if (CHECK_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND))
3051 {
3052 vty_out(vty, " authenticate snp ");
3053 if (CHECK_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV))
3054 vty_out(vty, "validate");
3055 else
3056 vty_out(vty, "send-only");
3057 }
3058 vty_out(vty, "%s", VTY_NEWLINE);
hasso53c997c2004-09-15 16:21:59 +00003059 write++;
3060 }
hassof1082d12005-09-19 04:23:34 +00003061
Josh Bailey3f045a02012-03-24 08:35:20 -07003062 if (area->log_adj_changes)
3063 {
3064 vty_out (vty, " log-adjacency-changes%s", VTY_NEWLINE);
3065 write++;
3066 }
3067
hassof390d2c2004-09-10 20:48:21 +00003068#ifdef TOPOLOGY_GENERATE
hassof1082d12005-09-19 04:23:34 +00003069 if (memcmp (area->topology_baseis, DEFAULT_TOPOLOGY_BASEIS,
3070 ISIS_SYS_ID_LEN))
3071 {
3072 vty_out (vty, " topology base-is %s%s",
Josh Bailey3f045a02012-03-24 08:35:20 -07003073 sysid_print ((u_char *)area->topology_baseis), VTY_NEWLINE);
hassof1082d12005-09-19 04:23:34 +00003074 write++;
3075 }
3076 if (area->topology_basedynh)
3077 {
3078 vty_out (vty, " topology base-dynh %s%s",
3079 area->topology_basedynh, VTY_NEWLINE);
3080 write++;
3081 }
3082 /* We save the whole command line here. */
3083 if (strlen(area->top_params))
hassof390d2c2004-09-10 20:48:21 +00003084 {
3085 vty_out (vty, " %s%s", area->top_params, VTY_NEWLINE);
3086 write++;
3087 }
hassof390d2c2004-09-10 20:48:21 +00003088#endif /* TOPOLOGY_GENERATE */
hassof1082d12005-09-19 04:23:34 +00003089
hassof390d2c2004-09-10 20:48:21 +00003090 }
Olivier Dugeon4f593572016-04-19 19:03:05 +02003091 isis_mpls_te_config_write_router(vty);
jardineb5d44e2003-12-23 08:09:43 +00003092 }
hassof390d2c2004-09-10 20:48:21 +00003093
jardineb5d44e2003-12-23 08:09:43 +00003094 return write;
3095}
3096
Josh Bailey3f045a02012-03-24 08:35:20 -07003097struct cmd_node isis_node = {
jardineb5d44e2003-12-23 08:09:43 +00003098 ISIS_NODE,
hasso2097cd82003-12-23 11:51:08 +00003099 "%s(config-router)# ",
jardineb5d44e2003-12-23 08:09:43 +00003100 1
3101};
3102
hassof390d2c2004-09-10 20:48:21 +00003103void
jardineb5d44e2003-12-23 08:09:43 +00003104isis_init ()
3105{
jardineb5d44e2003-12-23 08:09:43 +00003106 /* Install IS-IS top node */
3107 install_node (&isis_node, isis_config_write);
hassof390d2c2004-09-10 20:48:21 +00003108
Josh Bailey3f045a02012-03-24 08:35:20 -07003109 install_element (VIEW_NODE, &show_isis_summary_cmd);
3110
3111 install_element (VIEW_NODE, &show_isis_interface_cmd);
3112 install_element (VIEW_NODE, &show_isis_interface_detail_cmd);
3113 install_element (VIEW_NODE, &show_isis_interface_arg_cmd);
3114
3115 install_element (VIEW_NODE, &show_isis_neighbor_cmd);
3116 install_element (VIEW_NODE, &show_isis_neighbor_detail_cmd);
3117 install_element (VIEW_NODE, &show_isis_neighbor_arg_cmd);
3118 install_element (VIEW_NODE, &clear_isis_neighbor_cmd);
3119 install_element (VIEW_NODE, &clear_isis_neighbor_arg_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003120
3121 install_element (VIEW_NODE, &show_hostname_cmd);
3122 install_element (VIEW_NODE, &show_database_cmd);
Josh Bailey3f045a02012-03-24 08:35:20 -07003123 install_element (VIEW_NODE, &show_database_arg_cmd);
3124 install_element (VIEW_NODE, &show_database_arg_detail_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003125 install_element (VIEW_NODE, &show_database_detail_cmd);
Josh Bailey3f045a02012-03-24 08:35:20 -07003126 install_element (VIEW_NODE, &show_database_detail_arg_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003127
Olivier Dugeon4f593572016-04-19 19:03:05 +02003128 install_element (ENABLE_NODE, &show_debugging_isis_cmd);
3129
hassof390d2c2004-09-10 20:48:21 +00003130 install_node (&debug_node, config_write_debug);
jardin9e867fe2003-12-23 08:56:18 +00003131
jardineb5d44e2003-12-23 08:09:43 +00003132 install_element (ENABLE_NODE, &debug_isis_adj_cmd);
3133 install_element (ENABLE_NODE, &no_debug_isis_adj_cmd);
3134 install_element (ENABLE_NODE, &debug_isis_csum_cmd);
3135 install_element (ENABLE_NODE, &no_debug_isis_csum_cmd);
3136 install_element (ENABLE_NODE, &debug_isis_lupd_cmd);
3137 install_element (ENABLE_NODE, &no_debug_isis_lupd_cmd);
3138 install_element (ENABLE_NODE, &debug_isis_err_cmd);
3139 install_element (ENABLE_NODE, &no_debug_isis_err_cmd);
3140 install_element (ENABLE_NODE, &debug_isis_snp_cmd);
3141 install_element (ENABLE_NODE, &no_debug_isis_snp_cmd);
3142 install_element (ENABLE_NODE, &debug_isis_upd_cmd);
3143 install_element (ENABLE_NODE, &no_debug_isis_upd_cmd);
3144 install_element (ENABLE_NODE, &debug_isis_spfevents_cmd);
3145 install_element (ENABLE_NODE, &no_debug_isis_spfevents_cmd);
3146 install_element (ENABLE_NODE, &debug_isis_spfstats_cmd);
3147 install_element (ENABLE_NODE, &no_debug_isis_spfstats_cmd);
3148 install_element (ENABLE_NODE, &debug_isis_spftrigg_cmd);
3149 install_element (ENABLE_NODE, &no_debug_isis_spftrigg_cmd);
3150 install_element (ENABLE_NODE, &debug_isis_rtevents_cmd);
3151 install_element (ENABLE_NODE, &no_debug_isis_rtevents_cmd);
3152 install_element (ENABLE_NODE, &debug_isis_events_cmd);
3153 install_element (ENABLE_NODE, &no_debug_isis_events_cmd);
Josh Bailey3f045a02012-03-24 08:35:20 -07003154 install_element (ENABLE_NODE, &debug_isis_packet_dump_cmd);
3155 install_element (ENABLE_NODE, &no_debug_isis_packet_dump_cmd);
Christian Franke80a8f722015-11-12 14:21:47 +01003156 install_element (ENABLE_NODE, &debug_isis_lsp_gen_cmd);
3157 install_element (ENABLE_NODE, &no_debug_isis_lsp_gen_cmd);
Christian Franke61010c32015-11-10 18:43:34 +01003158 install_element (ENABLE_NODE, &debug_isis_lsp_sched_cmd);
3159 install_element (ENABLE_NODE, &no_debug_isis_lsp_sched_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003160
jardin9e867fe2003-12-23 08:56:18 +00003161 install_element (CONFIG_NODE, &debug_isis_adj_cmd);
3162 install_element (CONFIG_NODE, &no_debug_isis_adj_cmd);
3163 install_element (CONFIG_NODE, &debug_isis_csum_cmd);
3164 install_element (CONFIG_NODE, &no_debug_isis_csum_cmd);
3165 install_element (CONFIG_NODE, &debug_isis_lupd_cmd);
3166 install_element (CONFIG_NODE, &no_debug_isis_lupd_cmd);
3167 install_element (CONFIG_NODE, &debug_isis_err_cmd);
3168 install_element (CONFIG_NODE, &no_debug_isis_err_cmd);
3169 install_element (CONFIG_NODE, &debug_isis_snp_cmd);
3170 install_element (CONFIG_NODE, &no_debug_isis_snp_cmd);
3171 install_element (CONFIG_NODE, &debug_isis_upd_cmd);
3172 install_element (CONFIG_NODE, &no_debug_isis_upd_cmd);
3173 install_element (CONFIG_NODE, &debug_isis_spfevents_cmd);
3174 install_element (CONFIG_NODE, &no_debug_isis_spfevents_cmd);
3175 install_element (CONFIG_NODE, &debug_isis_spfstats_cmd);
3176 install_element (CONFIG_NODE, &no_debug_isis_spfstats_cmd);
3177 install_element (CONFIG_NODE, &debug_isis_spftrigg_cmd);
3178 install_element (CONFIG_NODE, &no_debug_isis_spftrigg_cmd);
3179 install_element (CONFIG_NODE, &debug_isis_rtevents_cmd);
3180 install_element (CONFIG_NODE, &no_debug_isis_rtevents_cmd);
3181 install_element (CONFIG_NODE, &debug_isis_events_cmd);
3182 install_element (CONFIG_NODE, &no_debug_isis_events_cmd);
Josh Bailey3f045a02012-03-24 08:35:20 -07003183 install_element (CONFIG_NODE, &debug_isis_packet_dump_cmd);
3184 install_element (CONFIG_NODE, &no_debug_isis_packet_dump_cmd);
Christian Franke80a8f722015-11-12 14:21:47 +01003185 install_element (CONFIG_NODE, &debug_isis_lsp_gen_cmd);
3186 install_element (CONFIG_NODE, &no_debug_isis_lsp_gen_cmd);
Christian Franke61010c32015-11-10 18:43:34 +01003187 install_element (CONFIG_NODE, &debug_isis_lsp_sched_cmd);
3188 install_element (CONFIG_NODE, &no_debug_isis_lsp_sched_cmd);
jardin9e867fe2003-12-23 08:56:18 +00003189
jardineb5d44e2003-12-23 08:09:43 +00003190 install_element (CONFIG_NODE, &router_isis_cmd);
3191 install_element (CONFIG_NODE, &no_router_isis_cmd);
3192
3193 install_default (ISIS_NODE);
3194
3195 install_element (ISIS_NODE, &net_cmd);
3196 install_element (ISIS_NODE, &no_net_cmd);
3197
3198 install_element (ISIS_NODE, &is_type_cmd);
3199 install_element (ISIS_NODE, &no_is_type_cmd);
3200
Christian Frankef1fc1db2015-11-10 18:43:31 +01003201 install_element (ISIS_NODE, &area_lsp_mtu_cmd);
3202 install_element (ISIS_NODE, &no_area_lsp_mtu_cmd);
3203 install_element (ISIS_NODE, &no_area_lsp_mtu_arg_cmd);
3204
Josh Bailey3f045a02012-03-24 08:35:20 -07003205 install_element (ISIS_NODE, &area_passwd_md5_cmd);
3206 install_element (ISIS_NODE, &area_passwd_md5_snpauth_cmd);
3207 install_element (ISIS_NODE, &area_passwd_clear_cmd);
3208 install_element (ISIS_NODE, &area_passwd_clear_snpauth_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003209 install_element (ISIS_NODE, &no_area_passwd_cmd);
3210
Josh Bailey3f045a02012-03-24 08:35:20 -07003211 install_element (ISIS_NODE, &domain_passwd_md5_cmd);
3212 install_element (ISIS_NODE, &domain_passwd_md5_snpauth_cmd);
3213 install_element (ISIS_NODE, &domain_passwd_clear_cmd);
3214 install_element (ISIS_NODE, &domain_passwd_clear_snpauth_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003215 install_element (ISIS_NODE, &no_domain_passwd_cmd);
3216
3217 install_element (ISIS_NODE, &lsp_gen_interval_cmd);
3218 install_element (ISIS_NODE, &no_lsp_gen_interval_cmd);
3219 install_element (ISIS_NODE, &no_lsp_gen_interval_arg_cmd);
3220 install_element (ISIS_NODE, &lsp_gen_interval_l1_cmd);
3221 install_element (ISIS_NODE, &no_lsp_gen_interval_l1_cmd);
3222 install_element (ISIS_NODE, &no_lsp_gen_interval_l1_arg_cmd);
3223 install_element (ISIS_NODE, &lsp_gen_interval_l2_cmd);
3224 install_element (ISIS_NODE, &no_lsp_gen_interval_l2_cmd);
3225 install_element (ISIS_NODE, &no_lsp_gen_interval_l2_arg_cmd);
3226
3227 install_element (ISIS_NODE, &spf_interval_cmd);
3228 install_element (ISIS_NODE, &no_spf_interval_cmd);
3229 install_element (ISIS_NODE, &no_spf_interval_arg_cmd);
3230 install_element (ISIS_NODE, &spf_interval_l1_cmd);
3231 install_element (ISIS_NODE, &no_spf_interval_l1_cmd);
3232 install_element (ISIS_NODE, &no_spf_interval_l1_arg_cmd);
3233 install_element (ISIS_NODE, &spf_interval_l2_cmd);
3234 install_element (ISIS_NODE, &no_spf_interval_l2_cmd);
3235 install_element (ISIS_NODE, &no_spf_interval_l2_arg_cmd);
hassof390d2c2004-09-10 20:48:21 +00003236
Josh Bailey3f045a02012-03-24 08:35:20 -07003237 install_element (ISIS_NODE, &max_lsp_lifetime_cmd);
3238 install_element (ISIS_NODE, &no_max_lsp_lifetime_cmd);
3239 install_element (ISIS_NODE, &no_max_lsp_lifetime_arg_cmd);
3240 install_element (ISIS_NODE, &max_lsp_lifetime_l1_cmd);
3241 install_element (ISIS_NODE, &no_max_lsp_lifetime_l1_cmd);
3242 install_element (ISIS_NODE, &no_max_lsp_lifetime_l1_arg_cmd);
3243 install_element (ISIS_NODE, &max_lsp_lifetime_l2_cmd);
3244 install_element (ISIS_NODE, &no_max_lsp_lifetime_l2_cmd);
3245 install_element (ISIS_NODE, &no_max_lsp_lifetime_l2_arg_cmd);
3246
3247 install_element (ISIS_NODE, &lsp_refresh_interval_cmd);
3248 install_element (ISIS_NODE, &no_lsp_refresh_interval_cmd);
3249 install_element (ISIS_NODE, &no_lsp_refresh_interval_arg_cmd);
3250 install_element (ISIS_NODE, &lsp_refresh_interval_l1_cmd);
3251 install_element (ISIS_NODE, &no_lsp_refresh_interval_l1_cmd);
3252 install_element (ISIS_NODE, &no_lsp_refresh_interval_l1_arg_cmd);
3253 install_element (ISIS_NODE, &lsp_refresh_interval_l2_cmd);
3254 install_element (ISIS_NODE, &no_lsp_refresh_interval_l2_cmd);
3255 install_element (ISIS_NODE, &no_lsp_refresh_interval_l2_arg_cmd);
3256
Josh Bailey3f045a02012-03-24 08:35:20 -07003257 install_element (ISIS_NODE, &log_adj_changes_cmd);
3258 install_element (ISIS_NODE, &no_log_adj_changes_cmd);
3259
jardineb5d44e2003-12-23 08:09:43 +00003260#ifdef TOPOLOGY_GENERATE
3261 install_element (ISIS_NODE, &topology_generate_grid_cmd);
3262 install_element (ISIS_NODE, &topology_baseis_cmd);
hassof1082d12005-09-19 04:23:34 +00003263 install_element (ISIS_NODE, &topology_basedynh_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003264 install_element (ISIS_NODE, &no_topology_baseis_cmd);
hassof1082d12005-09-19 04:23:34 +00003265 install_element (ISIS_NODE, &no_topology_baseis_noid_cmd);
hassof695b012005-04-02 19:03:39 +00003266 install_element (VIEW_NODE, &show_isis_generated_topology_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003267#endif /* TOPOLOGY_GENERATE */
jardineb5d44e2003-12-23 08:09:43 +00003268}