blob: 55a62d38ea90637dcfd82333bf275121c964bd7d [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 Franke304c7da2016-07-28 17:23:29 +02001618void isis_area_lsp_mtu_set(struct isis_area *area, unsigned int lsp_mtu)
Christian Frankef1fc1db2015-11-10 18:43:31 +01001619{
Christian Frankef1fc1db2015-11-10 18:43:31 +01001620 area->lsp_mtu = lsp_mtu;
1621 lsp_regenerate_schedule(area, IS_LEVEL_1_AND_2, 1);
Christian Frankef1fc1db2015-11-10 18:43:31 +01001622}
1623
Josh Bailey3f045a02012-03-24 08:35:20 -07001624DEFUN (area_passwd_md5,
1625 area_passwd_md5_cmd,
1626 "area-password md5 WORD",
jardineb5d44e2003-12-23 08:09:43 +00001627 "Configure the authentication password for an area\n"
Josh Bailey3f045a02012-03-24 08:35:20 -07001628 "Authentication type\n"
hassof390d2c2004-09-10 20:48:21 +00001629 "Area password\n")
jardineb5d44e2003-12-23 08:09:43 +00001630{
1631 struct isis_area *area;
1632 int len;
1633
1634 area = vty->index;
1635
hassof390d2c2004-09-10 20:48:21 +00001636 if (!area)
1637 {
Josh Bailey3f045a02012-03-24 08:35:20 -07001638 vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
1639 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00001640 }
1641
jardineb5d44e2003-12-23 08:09:43 +00001642 len = strlen (argv[0]);
hassof390d2c2004-09-10 20:48:21 +00001643 if (len > 254)
1644 {
1645 vty_out (vty, "Too long area password (>254)%s", VTY_NEWLINE);
Josh Bailey3f045a02012-03-24 08:35:20 -07001646 return CMD_ERR_AMBIGUOUS;
hassof390d2c2004-09-10 20:48:21 +00001647 }
Josh Bailey3f045a02012-03-24 08:35:20 -07001648
1649 area->area_passwd.len = (u_char) len;
1650 area->area_passwd.type = ISIS_PASSWD_TYPE_HMAC_MD5;
1651 strncpy ((char *)area->area_passwd.passwd, argv[0], 255);
1652
1653 if (argc > 1)
1654 {
1655 SET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND);
1656 if (strncmp(argv[1], "v", 1) == 0)
1657 SET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV);
1658 else
1659 UNSET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV);
1660 }
1661 else
1662 {
1663 UNSET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND);
1664 UNSET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV);
1665 }
1666 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
1667
1668 return CMD_SUCCESS;
1669}
1670
1671ALIAS (area_passwd_md5,
1672 area_passwd_md5_snpauth_cmd,
1673 "area-password md5 WORD authenticate snp (send-only|validate)",
1674 "Configure the authentication password for an area\n"
1675 "Authentication type\n"
1676 "Area password\n"
1677 "Authentication\n"
1678 "SNP PDUs\n"
1679 "Send but do not check PDUs on receiving\n"
David Lamparterb7d50212015-03-03 08:53:18 +01001680 "Send and check PDUs on receiving\n")
Josh Bailey3f045a02012-03-24 08:35:20 -07001681
1682DEFUN (area_passwd_clear,
1683 area_passwd_clear_cmd,
1684 "area-password clear WORD",
1685 "Configure the authentication password for an area\n"
1686 "Authentication type\n"
1687 "Area password\n")
1688{
1689 struct isis_area *area;
1690 int len;
1691
1692 area = vty->index;
1693
1694 if (!area)
1695 {
1696 vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
1697 return CMD_ERR_NO_MATCH;
1698 }
1699
1700 len = strlen (argv[0]);
1701 if (len > 254)
1702 {
1703 vty_out (vty, "Too long area password (>254)%s", VTY_NEWLINE);
1704 return CMD_ERR_AMBIGUOUS;
1705 }
1706
hassof390d2c2004-09-10 20:48:21 +00001707 area->area_passwd.len = (u_char) len;
jardineb5d44e2003-12-23 08:09:43 +00001708 area->area_passwd.type = ISIS_PASSWD_TYPE_CLEARTXT;
hassof7c43dc2004-09-26 16:24:14 +00001709 strncpy ((char *)area->area_passwd.passwd, argv[0], 255);
hassof390d2c2004-09-10 20:48:21 +00001710
hasso1cbc5622005-01-01 10:29:51 +00001711 if (argc > 1)
1712 {
1713 SET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND);
1714 if (strncmp(argv[1], "v", 1) == 0)
1715 SET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV);
1716 else
1717 UNSET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV);
1718 }
1719 else
1720 {
1721 UNSET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND);
1722 UNSET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV);
1723 }
Josh Bailey3f045a02012-03-24 08:35:20 -07001724 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
hasso1cbc5622005-01-01 10:29:51 +00001725
jardineb5d44e2003-12-23 08:09:43 +00001726 return CMD_SUCCESS;
1727}
1728
Josh Bailey3f045a02012-03-24 08:35:20 -07001729ALIAS (area_passwd_clear,
1730 area_passwd_clear_snpauth_cmd,
1731 "area-password clear WORD authenticate snp (send-only|validate)",
hasso1cbc5622005-01-01 10:29:51 +00001732 "Configure the authentication password for an area\n"
Josh Bailey3f045a02012-03-24 08:35:20 -07001733 "Authentication type\n"
hasso1cbc5622005-01-01 10:29:51 +00001734 "Area password\n"
1735 "Authentication\n"
1736 "SNP PDUs\n"
1737 "Send but do not check PDUs on receiving\n"
David Lamparterb7d50212015-03-03 08:53:18 +01001738 "Send and check PDUs on receiving\n")
hasso1cbc5622005-01-01 10:29:51 +00001739
jardineb5d44e2003-12-23 08:09:43 +00001740DEFUN (no_area_passwd,
1741 no_area_passwd_cmd,
1742 "no area-password",
1743 NO_STR
1744 "Configure the authentication password for an area\n")
1745{
1746 struct isis_area *area;
hassof390d2c2004-09-10 20:48:21 +00001747
jardineb5d44e2003-12-23 08:09:43 +00001748 area = vty->index;
1749
hassof390d2c2004-09-10 20:48:21 +00001750 if (!area)
1751 {
Josh Bailey3f045a02012-03-24 08:35:20 -07001752 vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
1753 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00001754 }
1755
jardineb5d44e2003-12-23 08:09:43 +00001756 memset (&area->area_passwd, 0, sizeof (struct isis_passwd));
Josh Bailey3f045a02012-03-24 08:35:20 -07001757 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
jardineb5d44e2003-12-23 08:09:43 +00001758
1759 return CMD_SUCCESS;
1760}
1761
Josh Bailey3f045a02012-03-24 08:35:20 -07001762DEFUN (domain_passwd_md5,
1763 domain_passwd_md5_cmd,
1764 "domain-password md5 WORD",
jardineb5d44e2003-12-23 08:09:43 +00001765 "Set the authentication password for a routing domain\n"
Josh Bailey3f045a02012-03-24 08:35:20 -07001766 "Authentication type\n"
hassof390d2c2004-09-10 20:48:21 +00001767 "Routing domain password\n")
jardineb5d44e2003-12-23 08:09:43 +00001768{
1769 struct isis_area *area;
1770 int len;
1771
1772 area = vty->index;
1773
hassof390d2c2004-09-10 20:48:21 +00001774 if (!area)
1775 {
Josh Bailey3f045a02012-03-24 08:35:20 -07001776 vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
1777 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00001778 }
1779
jardineb5d44e2003-12-23 08:09:43 +00001780 len = strlen (argv[0]);
hassof390d2c2004-09-10 20:48:21 +00001781 if (len > 254)
1782 {
1783 vty_out (vty, "Too long area password (>254)%s", VTY_NEWLINE);
Josh Bailey3f045a02012-03-24 08:35:20 -07001784 return CMD_ERR_AMBIGUOUS;
hassof390d2c2004-09-10 20:48:21 +00001785 }
Josh Bailey3f045a02012-03-24 08:35:20 -07001786
1787 area->domain_passwd.len = (u_char) len;
1788 area->domain_passwd.type = ISIS_PASSWD_TYPE_HMAC_MD5;
1789 strncpy ((char *)area->domain_passwd.passwd, argv[0], 255);
1790
1791 if (argc > 1)
1792 {
1793 SET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND);
1794 if (strncmp(argv[1], "v", 1) == 0)
1795 SET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV);
1796 else
1797 UNSET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV);
1798 }
1799 else
1800 {
1801 UNSET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND);
1802 UNSET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV);
1803 }
1804 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
1805
1806 return CMD_SUCCESS;
1807}
1808
1809ALIAS (domain_passwd_md5,
1810 domain_passwd_md5_snpauth_cmd,
1811 "domain-password md5 WORD authenticate snp (send-only|validate)",
1812 "Set the authentication password for a routing domain\n"
1813 "Authentication type\n"
1814 "Routing domain password\n"
1815 "Authentication\n"
1816 "SNP PDUs\n"
1817 "Send but do not check PDUs on receiving\n"
David Lamparterb7d50212015-03-03 08:53:18 +01001818 "Send and check PDUs on receiving\n")
Josh Bailey3f045a02012-03-24 08:35:20 -07001819
1820DEFUN (domain_passwd_clear,
1821 domain_passwd_clear_cmd,
1822 "domain-password clear WORD",
1823 "Set the authentication password for a routing domain\n"
1824 "Authentication type\n"
1825 "Routing domain password\n")
1826{
1827 struct isis_area *area;
1828 int len;
1829
1830 area = vty->index;
1831
1832 if (!area)
1833 {
1834 vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
1835 return CMD_ERR_NO_MATCH;
1836 }
1837
1838 len = strlen (argv[0]);
1839 if (len > 254)
1840 {
1841 vty_out (vty, "Too long area password (>254)%s", VTY_NEWLINE);
1842 return CMD_ERR_AMBIGUOUS;
1843 }
1844
hassof390d2c2004-09-10 20:48:21 +00001845 area->domain_passwd.len = (u_char) len;
jardineb5d44e2003-12-23 08:09:43 +00001846 area->domain_passwd.type = ISIS_PASSWD_TYPE_CLEARTXT;
hassof7c43dc2004-09-26 16:24:14 +00001847 strncpy ((char *)area->domain_passwd.passwd, argv[0], 255);
hassof390d2c2004-09-10 20:48:21 +00001848
hasso1cbc5622005-01-01 10:29:51 +00001849 if (argc > 1)
1850 {
1851 SET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND);
1852 if (strncmp(argv[1], "v", 1) == 0)
1853 SET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV);
1854 else
1855 UNSET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV);
1856 }
1857 else
1858 {
1859 UNSET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND);
1860 UNSET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV);
1861 }
Josh Bailey3f045a02012-03-24 08:35:20 -07001862 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
hasso1cbc5622005-01-01 10:29:51 +00001863
jardineb5d44e2003-12-23 08:09:43 +00001864 return CMD_SUCCESS;
1865}
1866
Josh Bailey3f045a02012-03-24 08:35:20 -07001867ALIAS (domain_passwd_clear,
1868 domain_passwd_clear_snpauth_cmd,
1869 "domain-password clear WORD authenticate snp (send-only|validate)",
hasso1cbc5622005-01-01 10:29:51 +00001870 "Set the authentication password for a routing domain\n"
Josh Bailey3f045a02012-03-24 08:35:20 -07001871 "Authentication type\n"
hasso1cbc5622005-01-01 10:29:51 +00001872 "Routing domain password\n"
1873 "Authentication\n"
1874 "SNP PDUs\n"
1875 "Send but do not check PDUs on receiving\n"
David Lamparterb7d50212015-03-03 08:53:18 +01001876 "Send and check PDUs on receiving\n")
hasso1cbc5622005-01-01 10:29:51 +00001877
jardineb5d44e2003-12-23 08:09:43 +00001878DEFUN (no_domain_passwd,
1879 no_domain_passwd_cmd,
Josh Bailey3f045a02012-03-24 08:35:20 -07001880 "no domain-password",
jardineb5d44e2003-12-23 08:09:43 +00001881 NO_STR
1882 "Set the authentication password for a routing domain\n")
1883{
1884 struct isis_area *area;
hassof390d2c2004-09-10 20:48:21 +00001885
jardineb5d44e2003-12-23 08:09:43 +00001886 area = vty->index;
1887
hassof390d2c2004-09-10 20:48:21 +00001888 if (!area)
1889 {
Josh Bailey3f045a02012-03-24 08:35:20 -07001890 vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
1891 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00001892 }
1893
jardineb5d44e2003-12-23 08:09:43 +00001894 memset (&area->domain_passwd, 0, sizeof (struct isis_passwd));
Josh Bailey3f045a02012-03-24 08:35:20 -07001895 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
hassof390d2c2004-09-10 20:48:21 +00001896
jardineb5d44e2003-12-23 08:09:43 +00001897 return CMD_SUCCESS;
1898}
1899
Christian Franke304c7da2016-07-28 17:23:29 +02001900static void
1901area_resign_level (struct isis_area *area, int level)
jardineb5d44e2003-12-23 08:09:43 +00001902{
Christian Franke304c7da2016-07-28 17:23:29 +02001903 if (area->lspdb[level - 1])
hassof390d2c2004-09-10 20:48:21 +00001904 {
Christian Franke304c7da2016-07-28 17:23:29 +02001905 lsp_db_destroy (area->lspdb[level - 1]);
1906 area->lspdb[level - 1] = NULL;
hassof390d2c2004-09-10 20:48:21 +00001907 }
Christian Franke304c7da2016-07-28 17:23:29 +02001908 if (area->spftree[level - 1])
hassof390d2c2004-09-10 20:48:21 +00001909 {
Christian Franke304c7da2016-07-28 17:23:29 +02001910 isis_spftree_del (area->spftree[level - 1]);
1911 area->spftree[level - 1] = NULL;
hassof390d2c2004-09-10 20:48:21 +00001912 }
Christian Franke304c7da2016-07-28 17:23:29 +02001913#ifdef HAVE_IPV6
1914 if (area->spftree6[level - 1])
1915 {
1916 isis_spftree_del (area->spftree6[level - 1]);
1917 area->spftree6[level - 1] = NULL;
1918 }
1919#endif
1920 if (area->route_table[level - 1])
1921 {
1922 route_table_finish (area->route_table[level - 1]);
1923 area->route_table[level - 1] = NULL;
1924 }
1925#ifdef HAVE_IPV6
1926 if (area->route_table6[level - 1])
1927 {
1928 route_table_finish (area->route_table6[level - 1]);
1929 area->route_table6[level - 1] = NULL;
1930 }
1931#endif /* HAVE_IPV6 */
jardineb5d44e2003-12-23 08:09:43 +00001932
Christian Franke304c7da2016-07-28 17:23:29 +02001933 sched_debug("ISIS (%s): Resigned from L%d - canceling LSP regeneration timer.",
1934 area->area_tag, level);
1935 THREAD_TIMER_OFF (area->t_lsp_refresh[level - 1]);
1936 area->lsp_regenerate_pending[level - 1] = 0;
jardineb5d44e2003-12-23 08:09:43 +00001937}
1938
Christian Franke304c7da2016-07-28 17:23:29 +02001939void
1940isis_area_is_type_set(struct isis_area *area, int is_type)
jardineb5d44e2003-12-23 08:09:43 +00001941{
Christian Franke304c7da2016-07-28 17:23:29 +02001942 struct listnode *node;
1943 struct isis_circuit *circuit;
jardineb5d44e2003-12-23 08:09:43 +00001944
Christian Franke304c7da2016-07-28 17:23:29 +02001945 if (isis->debugs & DEBUG_EVENTS)
1946 zlog_debug ("ISIS-Evt (%s) system type change %s -> %s", area->area_tag,
1947 circuit_t2string (area->is_type), circuit_t2string (is_type));
hassof390d2c2004-09-10 20:48:21 +00001948
Christian Franke304c7da2016-07-28 17:23:29 +02001949 if (area->is_type == is_type)
1950 return; /* No change */
jardineb5d44e2003-12-23 08:09:43 +00001951
Christian Franke304c7da2016-07-28 17:23:29 +02001952 switch (area->is_type)
1953 {
1954 case IS_LEVEL_1:
1955 if (is_type == IS_LEVEL_2)
1956 area_resign_level (area, IS_LEVEL_1);
jardineb5d44e2003-12-23 08:09:43 +00001957
Christian Franke304c7da2016-07-28 17:23:29 +02001958 if (area->lspdb[1] == NULL)
1959 area->lspdb[1] = lsp_db_init ();
1960 if (area->route_table[1] == NULL)
1961 area->route_table[1] = route_table_init ();
1962#ifdef HAVE_IPV6
1963 if (area->route_table6[1] == NULL)
1964 area->route_table6[1] = route_table_init ();
1965#endif /* HAVE_IPV6 */
1966 break;
1967
1968 case IS_LEVEL_1_AND_2:
1969 if (is_type == IS_LEVEL_1)
1970 area_resign_level (area, IS_LEVEL_2);
1971 else
1972 area_resign_level (area, IS_LEVEL_1);
1973 break;
1974
1975 case IS_LEVEL_2:
1976 if (is_type == IS_LEVEL_1)
1977 area_resign_level (area, IS_LEVEL_2);
1978
1979 if (area->lspdb[0] == NULL)
1980 area->lspdb[0] = lsp_db_init ();
1981 if (area->route_table[0] == NULL)
1982 area->route_table[0] = route_table_init ();
1983#ifdef HAVE_IPV6
1984 if (area->route_table6[0] == NULL)
1985 area->route_table6[0] = route_table_init ();
1986#endif /* HAVE_IPV6 */
1987 break;
1988
1989 default:
1990 break;
1991 }
1992
1993 area->is_type = is_type;
1994
1995 /* override circuit's is_type */
1996 if (area->is_type != IS_LEVEL_1_AND_2)
1997 {
1998 for (ALL_LIST_ELEMENTS_RO (area->circuit_list, node, circuit))
1999 isis_event_circuit_type_change (circuit, is_type);
2000 }
2001
2002 spftree_area_init (area);
2003
2004 if (is_type & IS_LEVEL_1)
2005 lsp_generate (area, IS_LEVEL_1);
2006 if (is_type & IS_LEVEL_2)
2007 lsp_generate (area, IS_LEVEL_2);
2008 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
2009
2010 return;
jardineb5d44e2003-12-23 08:09:43 +00002011}
2012
Christian Frankeccd485d2016-07-28 17:23:26 +02002013void isis_area_metricstyle_set(struct isis_area *area, bool old_metric,
2014 bool new_metric)
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002015{
Christian Frankeccd485d2016-07-28 17:23:26 +02002016 if (area->oldmetric != old_metric
2017 || area->newmetric != new_metric)
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002018 {
Christian Frankeccd485d2016-07-28 17:23:26 +02002019 area->oldmetric = old_metric;
2020 area->newmetric = new_metric;
2021 lsp_regenerate_schedule(area, IS_LEVEL_1 | IS_LEVEL_2, 1);
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002022 }
Christian Frankeccd485d2016-07-28 17:23:26 +02002023}
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002024
Christian Frankeccd485d2016-07-28 17:23:26 +02002025void isis_area_overload_bit_set(struct isis_area *area, bool overload_bit)
2026{
2027 char new_overload_bit = overload_bit ? LSPBIT_OL : 0;
2028
2029 if (new_overload_bit != area->overload_bit)
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002030 {
Christian Frankeccd485d2016-07-28 17:23:26 +02002031 area->overload_bit = new_overload_bit;
2032 lsp_regenerate_schedule(area, IS_LEVEL_1 | IS_LEVEL_2, 1);
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002033 }
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002034}
2035
Christian Frankeccd485d2016-07-28 17:23:26 +02002036void isis_area_attached_bit_set(struct isis_area *area, bool attached_bit)
jardineb5d44e2003-12-23 08:09:43 +00002037{
Christian Frankeccd485d2016-07-28 17:23:26 +02002038 char new_attached_bit = attached_bit ? LSPBIT_ATT : 0;
jardineb5d44e2003-12-23 08:09:43 +00002039
Christian Frankeccd485d2016-07-28 17:23:26 +02002040 if (new_attached_bit != area->attached_bit)
hasso2984d262005-09-26 16:49:07 +00002041 {
Christian Frankeccd485d2016-07-28 17:23:26 +02002042 area->attached_bit = new_attached_bit;
2043 lsp_regenerate_schedule(area, IS_LEVEL_1 | IS_LEVEL_2, 1);
hasso2984d262005-09-26 16:49:07 +00002044 }
Christian Frankeccd485d2016-07-28 17:23:26 +02002045}
2046
2047void isis_area_dynhostname_set(struct isis_area *area, bool dynhostname)
2048{
2049 if (area->dynhostname != dynhostname)
hasso2984d262005-09-26 16:49:07 +00002050 {
Christian Frankeccd485d2016-07-28 17:23:26 +02002051 area->dynhostname = dynhostname;
2052 lsp_regenerate_schedule(area, IS_LEVEL_1 | IS_LEVEL_2, 0);
hasso2984d262005-09-26 16:49:07 +00002053 }
jardineb5d44e2003-12-23 08:09:43 +00002054}
2055
Christian Franke4570ca42016-07-28 17:23:30 +02002056void
2057isis_area_max_lsp_lifetime_set(struct isis_area *area, int level,
2058 uint16_t max_lsp_lifetime)
jardineb5d44e2003-12-23 08:09:43 +00002059{
Christian Franke4570ca42016-07-28 17:23:30 +02002060 assert((level == IS_LEVEL_1) || (level == IS_LEVEL_2));
hassof390d2c2004-09-10 20:48:21 +00002061
Christian Franke4570ca42016-07-28 17:23:30 +02002062 if (area->max_lsp_lifetime[level-1] == max_lsp_lifetime)
2063 return;
hassof390d2c2004-09-10 20:48:21 +00002064
Christian Franke4570ca42016-07-28 17:23:30 +02002065 area->max_lsp_lifetime[level-1] = max_lsp_lifetime;
2066 lsp_regenerate_schedule(area, level, 1);
jardineb5d44e2003-12-23 08:09:43 +00002067}
2068
Christian Franke4570ca42016-07-28 17:23:30 +02002069void
2070isis_area_lsp_refresh_set(struct isis_area *area, int level,
2071 uint16_t lsp_refresh)
jardineb5d44e2003-12-23 08:09:43 +00002072{
Christian Franke4570ca42016-07-28 17:23:30 +02002073 assert((level == IS_LEVEL_1) || (level == IS_LEVEL_2));
hassof390d2c2004-09-10 20:48:21 +00002074
Christian Franke4570ca42016-07-28 17:23:30 +02002075 if (area->lsp_refresh[level-1] == lsp_refresh)
2076 return;
jardineb5d44e2003-12-23 08:09:43 +00002077
Christian Franke4570ca42016-07-28 17:23:30 +02002078 area->lsp_refresh[level-1] = lsp_refresh;
2079 lsp_regenerate_schedule(area, level, 1);
jardineb5d44e2003-12-23 08:09:43 +00002080}
2081
Josh Bailey3f045a02012-03-24 08:35:20 -07002082DEFUN (log_adj_changes,
2083 log_adj_changes_cmd,
2084 "log-adjacency-changes",
2085 "Log changes in adjacency state\n")
2086{
2087 struct isis_area *area;
2088
2089 area = vty->index;
2090 assert (area);
2091
2092 area->log_adj_changes = 1;
2093
2094 return CMD_SUCCESS;
2095}
2096
2097DEFUN (no_log_adj_changes,
2098 no_log_adj_changes_cmd,
2099 "no log-adjacency-changes",
2100 "Stop logging changes in adjacency state\n")
2101{
2102 struct isis_area *area;
2103
2104 area = vty->index;
2105 assert (area);
2106
2107 area->log_adj_changes = 0;
2108
2109 return CMD_SUCCESS;
2110}
2111
jardineb5d44e2003-12-23 08:09:43 +00002112#ifdef TOPOLOGY_GENERATE
Josh Bailey3f045a02012-03-24 08:35:20 -07002113
jardineb5d44e2003-12-23 08:09:43 +00002114DEFUN (topology_generate_grid,
2115 topology_generate_grid_cmd,
2116 "topology generate grid <1-100> <1-100> <1-65000> [param] [param] "
2117 "[param]",
hassof1082d12005-09-19 04:23:34 +00002118 "Topology generation for IS-IS\n"
2119 "Topology generation\n"
2120 "Grid topology\n"
jardineb5d44e2003-12-23 08:09:43 +00002121 "X parameter of the grid\n"
2122 "Y parameter of the grid\n"
2123 "Random seed\n"
2124 "Optional param 1\n"
2125 "Optional param 2\n"
2126 "Optional param 3\n"
2127 "Topology\n")
2128{
2129 struct isis_area *area;
2130
2131 area = vty->index;
2132 assert (area);
2133
hassof390d2c2004-09-10 20:48:21 +00002134 if (!spgrid_check_params (vty, argc, argv))
2135 {
2136 if (area->topology)
2137 list_delete (area->topology);
2138 area->topology = list_new ();
2139 memcpy (area->top_params, vty->buf, 200);
2140 gen_spgrid_topology (vty, area->topology);
2141 remove_topology_lsps (area);
2142 generate_topology_lsps (area);
hassof1082d12005-09-19 04:23:34 +00002143 /* Regenerate L1 LSP to get two way connection to the generated
2144 * topology. */
Josh Bailey3f045a02012-03-24 08:35:20 -07002145 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
hassof390d2c2004-09-10 20:48:21 +00002146 }
jardineb5d44e2003-12-23 08:09:43 +00002147
2148 return CMD_SUCCESS;
2149}
2150
hassof695b012005-04-02 19:03:39 +00002151DEFUN (show_isis_generated_topology,
2152 show_isis_generated_topology_cmd,
hassof1082d12005-09-19 04:23:34 +00002153 "show isis generated-topologies",
jardineb5d44e2003-12-23 08:09:43 +00002154 SHOW_STR
Josh Bailey3f045a02012-03-24 08:35:20 -07002155 "ISIS network information\n"
hassof1082d12005-09-19 04:23:34 +00002156 "Show generated topologies\n")
jardineb5d44e2003-12-23 08:09:43 +00002157{
2158 struct isis_area *area;
paul92c9f222005-05-25 12:21:13 +00002159 struct listnode *node;
jardineb5d44e2003-12-23 08:09:43 +00002160 struct listnode *node2;
2161 struct arc *arc;
hassof1082d12005-09-19 04:23:34 +00002162
paul92c9f222005-05-25 12:21:13 +00002163 for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
hassof1082d12005-09-19 04:23:34 +00002164 {
2165 if (!area->topology)
2166 continue;
2167
2168 vty_out (vty, "Topology for isis area: %s%s", area->area_tag,
2169 VTY_NEWLINE);
2170 vty_out (vty, "From node To node Distance%s", VTY_NEWLINE);
2171
2172 for (ALL_LIST_ELEMENTS_RO (area->topology, node2, arc))
2173 vty_out (vty, "%9ld %11ld %12ld%s", arc->from_node, arc->to_node,
2174 arc->distance, VTY_NEWLINE);
2175 }
jardineb5d44e2003-12-23 08:09:43 +00002176 return CMD_SUCCESS;
2177}
2178
hassof1082d12005-09-19 04:23:34 +00002179/* Base IS for topology generation. */
hassof390d2c2004-09-10 20:48:21 +00002180DEFUN (topology_baseis,
jardineb5d44e2003-12-23 08:09:43 +00002181 topology_baseis_cmd,
2182 "topology base-is WORD",
hassof1082d12005-09-19 04:23:34 +00002183 "Topology generation for IS-IS\n"
2184 "A Network IS Base for this topology\n"
2185 "XXXX.XXXX.XXXX Network entity title (NET)\n")
jardineb5d44e2003-12-23 08:09:43 +00002186{
2187 struct isis_area *area;
2188 u_char buff[ISIS_SYS_ID_LEN];
2189
2190 area = vty->index;
2191 assert (area);
2192
hassof390d2c2004-09-10 20:48:21 +00002193 if (sysid2buff (buff, argv[0]))
hassof1082d12005-09-19 04:23:34 +00002194 sysid2buff (area->topology_baseis, argv[0]);
hassof390d2c2004-09-10 20:48:21 +00002195
jardineb5d44e2003-12-23 08:09:43 +00002196 return CMD_SUCCESS;
2197}
2198
jardineb5d44e2003-12-23 08:09:43 +00002199DEFUN (no_topology_baseis,
2200 no_topology_baseis_cmd,
2201 "no topology base-is WORD",
2202 NO_STR
hassof1082d12005-09-19 04:23:34 +00002203 "Topology generation for IS-IS\n"
2204 "A Network IS Base for this topology\n"
2205 "XXXX.XXXX.XXXX Network entity title (NET)\n")
jardineb5d44e2003-12-23 08:09:43 +00002206{
2207 struct isis_area *area;
2208
2209 area = vty->index;
2210 assert (area);
2211
hassof390d2c2004-09-10 20:48:21 +00002212 memcpy (area->topology_baseis, DEFAULT_TOPOLOGY_BASEIS, ISIS_SYS_ID_LEN);
jardineb5d44e2003-12-23 08:09:43 +00002213 return CMD_SUCCESS;
2214}
2215
hassof1082d12005-09-19 04:23:34 +00002216ALIAS (no_topology_baseis,
2217 no_topology_baseis_noid_cmd,
2218 "no topology base-is",
2219 NO_STR
2220 "Topology generation for IS-IS\n"
2221 "A Network IS Base for this topology\n")
2222
2223DEFUN (topology_basedynh,
2224 topology_basedynh_cmd,
2225 "topology base-dynh WORD",
2226 "Topology generation for IS-IS\n"
2227 "Dynamic hostname base for this topology\n"
2228 "Dynamic hostname base\n")
2229{
2230 struct isis_area *area;
2231
2232 area = vty->index;
2233 assert (area);
2234
2235 /* I hope that it's enough. */
2236 area->topology_basedynh = strndup (argv[0], 16);
2237 return CMD_SUCCESS;
2238}
Josh Bailey3f045a02012-03-24 08:35:20 -07002239
jardineb5d44e2003-12-23 08:09:43 +00002240#endif /* TOPOLOGY_GENERATE */
2241
jardineb5d44e2003-12-23 08:09:43 +00002242/* IS-IS configuration write function */
2243int
2244isis_config_write (struct vty *vty)
2245{
2246 int write = 0;
jardineb5d44e2003-12-23 08:09:43 +00002247
hassof390d2c2004-09-10 20:48:21 +00002248 if (isis != NULL)
2249 {
2250 struct isis_area *area;
hasso3fdb2dd2005-09-28 18:45:54 +00002251 struct listnode *node, *node2;
jardineb5d44e2003-12-23 08:09:43 +00002252
hasso3fdb2dd2005-09-28 18:45:54 +00002253 for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
hassof390d2c2004-09-10 20:48:21 +00002254 {
2255 /* ISIS - Area name */
2256 vty_out (vty, "router isis %s%s", area->area_tag, VTY_NEWLINE);
2257 write++;
2258 /* ISIS - Net */
2259 if (listcount (area->area_addrs) > 0)
2260 {
2261 struct area_addr *area_addr;
hasso3fdb2dd2005-09-28 18:45:54 +00002262 for (ALL_LIST_ELEMENTS_RO (area->area_addrs, node2, area_addr))
2263 {
2264 vty_out (vty, " net %s%s",
2265 isonet_print (area_addr->area_addr,
2266 area_addr->addr_len + ISIS_SYS_ID_LEN +
2267 1), VTY_NEWLINE);
2268 write++;
2269 }
hassof390d2c2004-09-10 20:48:21 +00002270 }
hasso3fdb2dd2005-09-28 18:45:54 +00002271 /* ISIS - Dynamic hostname - Defaults to true so only display if
2272 * false. */
hassof390d2c2004-09-10 20:48:21 +00002273 if (!area->dynhostname)
2274 {
2275 vty_out (vty, " no hostname dynamic%s", VTY_NEWLINE);
2276 write++;
2277 }
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002278 /* ISIS - Metric-Style - when true displays wide */
2279 if (area->newmetric)
hassof390d2c2004-09-10 20:48:21 +00002280 {
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002281 if (!area->oldmetric)
2282 vty_out (vty, " metric-style wide%s", VTY_NEWLINE);
hasso2984d262005-09-26 16:49:07 +00002283 else
2284 vty_out (vty, " metric-style transition%s", VTY_NEWLINE);
hassof390d2c2004-09-10 20:48:21 +00002285 write++;
2286 }
Christian Frankef818c8f2012-11-27 01:10:28 +00002287 else
2288 {
2289 vty_out (vty, " metric-style narrow%s", VTY_NEWLINE);
2290 write++;
2291 }
Josh Bailey3f045a02012-03-24 08:35:20 -07002292 /* ISIS - overload-bit */
2293 if (area->overload_bit)
2294 {
2295 vty_out (vty, " set-overload-bit%s", VTY_NEWLINE);
2296 write++;
2297 }
hassof390d2c2004-09-10 20:48:21 +00002298 /* ISIS - Area is-type (level-1-2 is default) */
2299 if (area->is_type == IS_LEVEL_1)
2300 {
2301 vty_out (vty, " is-type level-1%s", VTY_NEWLINE);
2302 write++;
2303 }
Josh Bailey3f045a02012-03-24 08:35:20 -07002304 else if (area->is_type == IS_LEVEL_2)
hassof390d2c2004-09-10 20:48:21 +00002305 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002306 vty_out (vty, " is-type level-2-only%s", VTY_NEWLINE);
2307 write++;
hassof390d2c2004-09-10 20:48:21 +00002308 }
Christian Frankeacf98652015-11-12 14:24:22 +01002309 write += isis_redist_config_write(vty, area, AF_INET);
2310 write += isis_redist_config_write(vty, area, AF_INET6);
hassof390d2c2004-09-10 20:48:21 +00002311 /* ISIS - Lsp generation interval */
2312 if (area->lsp_gen_interval[0] == area->lsp_gen_interval[1])
2313 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002314 if (area->lsp_gen_interval[0] != DEFAULT_MIN_LSP_GEN_INTERVAL)
hassof390d2c2004-09-10 20:48:21 +00002315 {
2316 vty_out (vty, " lsp-gen-interval %d%s",
2317 area->lsp_gen_interval[0], VTY_NEWLINE);
2318 write++;
2319 }
2320 }
2321 else
2322 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002323 if (area->lsp_gen_interval[0] != DEFAULT_MIN_LSP_GEN_INTERVAL)
hassof390d2c2004-09-10 20:48:21 +00002324 {
2325 vty_out (vty, " lsp-gen-interval level-1 %d%s",
2326 area->lsp_gen_interval[0], VTY_NEWLINE);
2327 write++;
2328 }
Josh Bailey3f045a02012-03-24 08:35:20 -07002329 if (area->lsp_gen_interval[1] != DEFAULT_MIN_LSP_GEN_INTERVAL)
hassof390d2c2004-09-10 20:48:21 +00002330 {
2331 vty_out (vty, " lsp-gen-interval level-2 %d%s",
2332 area->lsp_gen_interval[1], VTY_NEWLINE);
2333 write++;
2334 }
2335 }
2336 /* ISIS - LSP lifetime */
2337 if (area->max_lsp_lifetime[0] == area->max_lsp_lifetime[1])
2338 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002339 if (area->max_lsp_lifetime[0] != DEFAULT_LSP_LIFETIME)
hassof390d2c2004-09-10 20:48:21 +00002340 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002341 vty_out (vty, " max-lsp-lifetime %u%s", area->max_lsp_lifetime[0],
hassof390d2c2004-09-10 20:48:21 +00002342 VTY_NEWLINE);
2343 write++;
2344 }
2345 }
2346 else
2347 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002348 if (area->max_lsp_lifetime[0] != DEFAULT_LSP_LIFETIME)
hassof390d2c2004-09-10 20:48:21 +00002349 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002350 vty_out (vty, " max-lsp-lifetime level-1 %u%s",
hassof390d2c2004-09-10 20:48:21 +00002351 area->max_lsp_lifetime[0], VTY_NEWLINE);
2352 write++;
2353 }
Josh Bailey3f045a02012-03-24 08:35:20 -07002354 if (area->max_lsp_lifetime[1] != DEFAULT_LSP_LIFETIME)
hassof390d2c2004-09-10 20:48:21 +00002355 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002356 vty_out (vty, " max-lsp-lifetime level-2 %u%s",
hassof390d2c2004-09-10 20:48:21 +00002357 area->max_lsp_lifetime[1], VTY_NEWLINE);
2358 write++;
2359 }
2360 }
Josh Bailey3f045a02012-03-24 08:35:20 -07002361 /* ISIS - LSP refresh interval */
2362 if (area->lsp_refresh[0] == area->lsp_refresh[1])
2363 {
2364 if (area->lsp_refresh[0] != DEFAULT_MAX_LSP_GEN_INTERVAL)
2365 {
2366 vty_out (vty, " lsp-refresh-interval %u%s", area->lsp_refresh[0],
2367 VTY_NEWLINE);
2368 write++;
2369 }
2370 }
2371 else
2372 {
2373 if (area->lsp_refresh[0] != DEFAULT_MAX_LSP_GEN_INTERVAL)
2374 {
2375 vty_out (vty, " lsp-refresh-interval level-1 %u%s",
2376 area->lsp_refresh[0], VTY_NEWLINE);
2377 write++;
2378 }
2379 if (area->lsp_refresh[1] != DEFAULT_MAX_LSP_GEN_INTERVAL)
2380 {
2381 vty_out (vty, " lsp-refresh-interval level-2 %u%s",
2382 area->lsp_refresh[1], VTY_NEWLINE);
2383 write++;
2384 }
2385 }
Christian Frankef1fc1db2015-11-10 18:43:31 +01002386 if (area->lsp_mtu != DEFAULT_LSP_MTU)
2387 {
2388 vty_out(vty, " lsp-mtu %u%s", area->lsp_mtu, VTY_NEWLINE);
2389 write++;
2390 }
2391
hasso13fb40a2005-10-01 06:03:04 +00002392 /* Minimum SPF interval. */
2393 if (area->min_spf_interval[0] == area->min_spf_interval[1])
2394 {
2395 if (area->min_spf_interval[0] != MINIMUM_SPF_INTERVAL)
2396 {
2397 vty_out (vty, " spf-interval %d%s",
2398 area->min_spf_interval[0], VTY_NEWLINE);
2399 write++;
2400 }
2401 }
2402 else
2403 {
2404 if (area->min_spf_interval[0] != MINIMUM_SPF_INTERVAL)
2405 {
2406 vty_out (vty, " spf-interval level-1 %d%s",
2407 area->min_spf_interval[0], VTY_NEWLINE);
2408 write++;
2409 }
2410 if (area->min_spf_interval[1] != MINIMUM_SPF_INTERVAL)
2411 {
2412 vty_out (vty, " spf-interval level-2 %d%s",
2413 area->min_spf_interval[1], VTY_NEWLINE);
2414 write++;
2415 }
2416 }
hasso53c997c2004-09-15 16:21:59 +00002417 /* Authentication passwords. */
Josh Bailey3f045a02012-03-24 08:35:20 -07002418 if (area->area_passwd.type == ISIS_PASSWD_TYPE_HMAC_MD5)
hasso53c997c2004-09-15 16:21:59 +00002419 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002420 vty_out(vty, " area-password md5 %s", area->area_passwd.passwd);
hasso1cbc5622005-01-01 10:29:51 +00002421 if (CHECK_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND))
2422 {
2423 vty_out(vty, " authenticate snp ");
2424 if (CHECK_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV))
2425 vty_out(vty, "validate");
2426 else
2427 vty_out(vty, "send-only");
2428 }
2429 vty_out(vty, "%s", VTY_NEWLINE);
hasso53c997c2004-09-15 16:21:59 +00002430 write++;
Josh Bailey3f045a02012-03-24 08:35:20 -07002431 }
2432 else if (area->area_passwd.type == ISIS_PASSWD_TYPE_CLEARTXT)
2433 {
2434 vty_out(vty, " area-password clear %s", area->area_passwd.passwd);
2435 if (CHECK_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND))
2436 {
2437 vty_out(vty, " authenticate snp ");
2438 if (CHECK_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV))
2439 vty_out(vty, "validate");
2440 else
2441 vty_out(vty, "send-only");
2442 }
2443 vty_out(vty, "%s", VTY_NEWLINE);
2444 write++;
2445 }
2446 if (area->domain_passwd.type == ISIS_PASSWD_TYPE_HMAC_MD5)
hasso53c997c2004-09-15 16:21:59 +00002447 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002448 vty_out(vty, " domain-password md5 %s",
2449 area->domain_passwd.passwd);
2450 if (CHECK_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND))
2451 {
2452 vty_out(vty, " authenticate snp ");
2453 if (CHECK_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV))
2454 vty_out(vty, "validate");
2455 else
2456 vty_out(vty, "send-only");
2457 }
2458 vty_out(vty, "%s", VTY_NEWLINE);
2459 write++;
2460 }
2461 else if (area->domain_passwd.type == ISIS_PASSWD_TYPE_CLEARTXT)
2462 {
2463 vty_out(vty, " domain-password clear %s",
2464 area->domain_passwd.passwd);
hasso1cbc5622005-01-01 10:29:51 +00002465 if (CHECK_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND))
2466 {
2467 vty_out(vty, " authenticate snp ");
2468 if (CHECK_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV))
2469 vty_out(vty, "validate");
2470 else
2471 vty_out(vty, "send-only");
2472 }
2473 vty_out(vty, "%s", VTY_NEWLINE);
hasso53c997c2004-09-15 16:21:59 +00002474 write++;
2475 }
hassof1082d12005-09-19 04:23:34 +00002476
Josh Bailey3f045a02012-03-24 08:35:20 -07002477 if (area->log_adj_changes)
2478 {
2479 vty_out (vty, " log-adjacency-changes%s", VTY_NEWLINE);
2480 write++;
2481 }
2482
hassof390d2c2004-09-10 20:48:21 +00002483#ifdef TOPOLOGY_GENERATE
hassof1082d12005-09-19 04:23:34 +00002484 if (memcmp (area->topology_baseis, DEFAULT_TOPOLOGY_BASEIS,
2485 ISIS_SYS_ID_LEN))
2486 {
2487 vty_out (vty, " topology base-is %s%s",
Josh Bailey3f045a02012-03-24 08:35:20 -07002488 sysid_print ((u_char *)area->topology_baseis), VTY_NEWLINE);
hassof1082d12005-09-19 04:23:34 +00002489 write++;
2490 }
2491 if (area->topology_basedynh)
2492 {
2493 vty_out (vty, " topology base-dynh %s%s",
2494 area->topology_basedynh, VTY_NEWLINE);
2495 write++;
2496 }
2497 /* We save the whole command line here. */
2498 if (strlen(area->top_params))
hassof390d2c2004-09-10 20:48:21 +00002499 {
2500 vty_out (vty, " %s%s", area->top_params, VTY_NEWLINE);
2501 write++;
2502 }
hassof390d2c2004-09-10 20:48:21 +00002503#endif /* TOPOLOGY_GENERATE */
hassof1082d12005-09-19 04:23:34 +00002504
hassof390d2c2004-09-10 20:48:21 +00002505 }
Olivier Dugeon4f593572016-04-19 19:03:05 +02002506 isis_mpls_te_config_write_router(vty);
jardineb5d44e2003-12-23 08:09:43 +00002507 }
hassof390d2c2004-09-10 20:48:21 +00002508
jardineb5d44e2003-12-23 08:09:43 +00002509 return write;
2510}
2511
Josh Bailey3f045a02012-03-24 08:35:20 -07002512struct cmd_node isis_node = {
jardineb5d44e2003-12-23 08:09:43 +00002513 ISIS_NODE,
hasso2097cd82003-12-23 11:51:08 +00002514 "%s(config-router)# ",
jardineb5d44e2003-12-23 08:09:43 +00002515 1
2516};
2517
hassof390d2c2004-09-10 20:48:21 +00002518void
jardineb5d44e2003-12-23 08:09:43 +00002519isis_init ()
2520{
jardineb5d44e2003-12-23 08:09:43 +00002521 /* Install IS-IS top node */
2522 install_node (&isis_node, isis_config_write);
hassof390d2c2004-09-10 20:48:21 +00002523
Josh Bailey3f045a02012-03-24 08:35:20 -07002524 install_element (VIEW_NODE, &show_isis_summary_cmd);
2525
2526 install_element (VIEW_NODE, &show_isis_interface_cmd);
2527 install_element (VIEW_NODE, &show_isis_interface_detail_cmd);
2528 install_element (VIEW_NODE, &show_isis_interface_arg_cmd);
2529
2530 install_element (VIEW_NODE, &show_isis_neighbor_cmd);
2531 install_element (VIEW_NODE, &show_isis_neighbor_detail_cmd);
2532 install_element (VIEW_NODE, &show_isis_neighbor_arg_cmd);
2533 install_element (VIEW_NODE, &clear_isis_neighbor_cmd);
2534 install_element (VIEW_NODE, &clear_isis_neighbor_arg_cmd);
jardineb5d44e2003-12-23 08:09:43 +00002535
2536 install_element (VIEW_NODE, &show_hostname_cmd);
2537 install_element (VIEW_NODE, &show_database_cmd);
Josh Bailey3f045a02012-03-24 08:35:20 -07002538 install_element (VIEW_NODE, &show_database_arg_cmd);
2539 install_element (VIEW_NODE, &show_database_arg_detail_cmd);
jardineb5d44e2003-12-23 08:09:43 +00002540 install_element (VIEW_NODE, &show_database_detail_cmd);
Josh Bailey3f045a02012-03-24 08:35:20 -07002541 install_element (VIEW_NODE, &show_database_detail_arg_cmd);
jardineb5d44e2003-12-23 08:09:43 +00002542
Olivier Dugeon4f593572016-04-19 19:03:05 +02002543 install_element (ENABLE_NODE, &show_debugging_isis_cmd);
2544
hassof390d2c2004-09-10 20:48:21 +00002545 install_node (&debug_node, config_write_debug);
jardin9e867fe2003-12-23 08:56:18 +00002546
jardineb5d44e2003-12-23 08:09:43 +00002547 install_element (ENABLE_NODE, &debug_isis_adj_cmd);
2548 install_element (ENABLE_NODE, &no_debug_isis_adj_cmd);
2549 install_element (ENABLE_NODE, &debug_isis_csum_cmd);
2550 install_element (ENABLE_NODE, &no_debug_isis_csum_cmd);
2551 install_element (ENABLE_NODE, &debug_isis_lupd_cmd);
2552 install_element (ENABLE_NODE, &no_debug_isis_lupd_cmd);
2553 install_element (ENABLE_NODE, &debug_isis_err_cmd);
2554 install_element (ENABLE_NODE, &no_debug_isis_err_cmd);
2555 install_element (ENABLE_NODE, &debug_isis_snp_cmd);
2556 install_element (ENABLE_NODE, &no_debug_isis_snp_cmd);
2557 install_element (ENABLE_NODE, &debug_isis_upd_cmd);
2558 install_element (ENABLE_NODE, &no_debug_isis_upd_cmd);
2559 install_element (ENABLE_NODE, &debug_isis_spfevents_cmd);
2560 install_element (ENABLE_NODE, &no_debug_isis_spfevents_cmd);
2561 install_element (ENABLE_NODE, &debug_isis_spfstats_cmd);
2562 install_element (ENABLE_NODE, &no_debug_isis_spfstats_cmd);
2563 install_element (ENABLE_NODE, &debug_isis_spftrigg_cmd);
2564 install_element (ENABLE_NODE, &no_debug_isis_spftrigg_cmd);
2565 install_element (ENABLE_NODE, &debug_isis_rtevents_cmd);
2566 install_element (ENABLE_NODE, &no_debug_isis_rtevents_cmd);
2567 install_element (ENABLE_NODE, &debug_isis_events_cmd);
2568 install_element (ENABLE_NODE, &no_debug_isis_events_cmd);
Josh Bailey3f045a02012-03-24 08:35:20 -07002569 install_element (ENABLE_NODE, &debug_isis_packet_dump_cmd);
2570 install_element (ENABLE_NODE, &no_debug_isis_packet_dump_cmd);
Christian Franke80a8f722015-11-12 14:21:47 +01002571 install_element (ENABLE_NODE, &debug_isis_lsp_gen_cmd);
2572 install_element (ENABLE_NODE, &no_debug_isis_lsp_gen_cmd);
Christian Franke61010c32015-11-10 18:43:34 +01002573 install_element (ENABLE_NODE, &debug_isis_lsp_sched_cmd);
2574 install_element (ENABLE_NODE, &no_debug_isis_lsp_sched_cmd);
jardineb5d44e2003-12-23 08:09:43 +00002575
jardin9e867fe2003-12-23 08:56:18 +00002576 install_element (CONFIG_NODE, &debug_isis_adj_cmd);
2577 install_element (CONFIG_NODE, &no_debug_isis_adj_cmd);
2578 install_element (CONFIG_NODE, &debug_isis_csum_cmd);
2579 install_element (CONFIG_NODE, &no_debug_isis_csum_cmd);
2580 install_element (CONFIG_NODE, &debug_isis_lupd_cmd);
2581 install_element (CONFIG_NODE, &no_debug_isis_lupd_cmd);
2582 install_element (CONFIG_NODE, &debug_isis_err_cmd);
2583 install_element (CONFIG_NODE, &no_debug_isis_err_cmd);
2584 install_element (CONFIG_NODE, &debug_isis_snp_cmd);
2585 install_element (CONFIG_NODE, &no_debug_isis_snp_cmd);
2586 install_element (CONFIG_NODE, &debug_isis_upd_cmd);
2587 install_element (CONFIG_NODE, &no_debug_isis_upd_cmd);
2588 install_element (CONFIG_NODE, &debug_isis_spfevents_cmd);
2589 install_element (CONFIG_NODE, &no_debug_isis_spfevents_cmd);
2590 install_element (CONFIG_NODE, &debug_isis_spfstats_cmd);
2591 install_element (CONFIG_NODE, &no_debug_isis_spfstats_cmd);
2592 install_element (CONFIG_NODE, &debug_isis_spftrigg_cmd);
2593 install_element (CONFIG_NODE, &no_debug_isis_spftrigg_cmd);
2594 install_element (CONFIG_NODE, &debug_isis_rtevents_cmd);
2595 install_element (CONFIG_NODE, &no_debug_isis_rtevents_cmd);
2596 install_element (CONFIG_NODE, &debug_isis_events_cmd);
2597 install_element (CONFIG_NODE, &no_debug_isis_events_cmd);
Josh Bailey3f045a02012-03-24 08:35:20 -07002598 install_element (CONFIG_NODE, &debug_isis_packet_dump_cmd);
2599 install_element (CONFIG_NODE, &no_debug_isis_packet_dump_cmd);
Christian Franke80a8f722015-11-12 14:21:47 +01002600 install_element (CONFIG_NODE, &debug_isis_lsp_gen_cmd);
2601 install_element (CONFIG_NODE, &no_debug_isis_lsp_gen_cmd);
Christian Franke61010c32015-11-10 18:43:34 +01002602 install_element (CONFIG_NODE, &debug_isis_lsp_sched_cmd);
2603 install_element (CONFIG_NODE, &no_debug_isis_lsp_sched_cmd);
jardin9e867fe2003-12-23 08:56:18 +00002604
jardineb5d44e2003-12-23 08:09:43 +00002605 install_element (CONFIG_NODE, &router_isis_cmd);
2606 install_element (CONFIG_NODE, &no_router_isis_cmd);
2607
2608 install_default (ISIS_NODE);
2609
2610 install_element (ISIS_NODE, &net_cmd);
2611 install_element (ISIS_NODE, &no_net_cmd);
2612
Josh Bailey3f045a02012-03-24 08:35:20 -07002613 install_element (ISIS_NODE, &area_passwd_md5_cmd);
2614 install_element (ISIS_NODE, &area_passwd_md5_snpauth_cmd);
2615 install_element (ISIS_NODE, &area_passwd_clear_cmd);
2616 install_element (ISIS_NODE, &area_passwd_clear_snpauth_cmd);
jardineb5d44e2003-12-23 08:09:43 +00002617 install_element (ISIS_NODE, &no_area_passwd_cmd);
2618
Josh Bailey3f045a02012-03-24 08:35:20 -07002619 install_element (ISIS_NODE, &domain_passwd_md5_cmd);
2620 install_element (ISIS_NODE, &domain_passwd_md5_snpauth_cmd);
2621 install_element (ISIS_NODE, &domain_passwd_clear_cmd);
2622 install_element (ISIS_NODE, &domain_passwd_clear_snpauth_cmd);
jardineb5d44e2003-12-23 08:09:43 +00002623 install_element (ISIS_NODE, &no_domain_passwd_cmd);
2624
Josh Bailey3f045a02012-03-24 08:35:20 -07002625 install_element (ISIS_NODE, &log_adj_changes_cmd);
2626 install_element (ISIS_NODE, &no_log_adj_changes_cmd);
2627
jardineb5d44e2003-12-23 08:09:43 +00002628#ifdef TOPOLOGY_GENERATE
2629 install_element (ISIS_NODE, &topology_generate_grid_cmd);
2630 install_element (ISIS_NODE, &topology_baseis_cmd);
hassof1082d12005-09-19 04:23:34 +00002631 install_element (ISIS_NODE, &topology_basedynh_cmd);
jardineb5d44e2003-12-23 08:09:43 +00002632 install_element (ISIS_NODE, &no_topology_baseis_cmd);
hassof1082d12005-09-19 04:23:34 +00002633 install_element (ISIS_NODE, &no_topology_baseis_noid_cmd);
hassof695b012005-04-02 19:03:39 +00002634 install_element (VIEW_NODE, &show_isis_generated_topology_cmd);
jardineb5d44e2003-12-23 08:09:43 +00002635#endif /* TOPOLOGY_GENERATE */
jardineb5d44e2003-12-23 08:09:43 +00002636}