blob: 24315572f434864fb3f6e36dcf0e2155198289d4 [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"
57
58#ifdef TOPOLOGY_GENERATE
59#include "spgrid.h"
hassof390d2c2004-09-10 20:48:21 +000060u_char DEFAULT_TOPOLOGY_BASEIS[6] = { 0xFE, 0xED, 0xFE, 0xED, 0x00, 0x00 };
jardineb5d44e2003-12-23 08:09:43 +000061#endif /* TOPOLOGY_GENERATE */
62
jardineb5d44e2003-12-23 08:09:43 +000063struct isis *isis = NULL;
jardineb5d44e2003-12-23 08:09:43 +000064
Paul Jakma41b36e92006-12-08 01:09:50 +000065/*
66 * Prototypes.
67 */
Paul Jakma41b36e92006-12-08 01:09:50 +000068int isis_area_get(struct vty *, const char *);
69int isis_area_destroy(struct vty *, const char *);
Josh Bailey3f045a02012-03-24 08:35:20 -070070int area_net_title(struct vty *, const char *);
71int area_clear_net_title(struct vty *, const char *);
72int show_isis_interface_common(struct vty *, const char *ifname, char);
73int show_isis_neighbor_common(struct vty *, const char *id, char);
74int clear_isis_neighbor_common(struct vty *, const char *id);
Paul Jakma41b36e92006-12-08 01:09:50 +000075int isis_config_write(struct vty *);
76
77
78
jardineb5d44e2003-12-23 08:09:43 +000079void
80isis_new (unsigned long process_id)
81{
hassoaac372f2005-09-01 17:52:33 +000082 isis = XCALLOC (MTYPE_ISIS, sizeof (struct isis));
jardineb5d44e2003-12-23 08:09:43 +000083 /*
84 * Default values
85 */
86 isis->max_area_addrs = 3;
jardineb5d44e2003-12-23 08:09:43 +000087 isis->process_id = process_id;
Josh Bailey3f045a02012-03-24 08:35:20 -070088 isis->router_id = 0;
jardineb5d44e2003-12-23 08:09:43 +000089 isis->area_list = list_new ();
90 isis->init_circ_list = list_new ();
91 isis->uptime = time (NULL);
92 isis->nexthops = list_new ();
93#ifdef HAVE_IPV6
94 isis->nexthops6 = list_new ();
95#endif /* HAVE_IPV6 */
Josh Bailey3f045a02012-03-24 08:35:20 -070096 dyn_cache_init ();
jardineb5d44e2003-12-23 08:09:43 +000097 /*
98 * uncomment the next line for full debugs
99 */
hassof390d2c2004-09-10 20:48:21 +0000100 /* isis->debugs = 0xFFFF; */
jardineb5d44e2003-12-23 08:09:43 +0000101}
102
103struct isis_area *
Josh Bailey3f045a02012-03-24 08:35:20 -0700104isis_area_create (const char *area_tag)
jardineb5d44e2003-12-23 08:09:43 +0000105{
jardineb5d44e2003-12-23 08:09:43 +0000106 struct isis_area *area;
hassof390d2c2004-09-10 20:48:21 +0000107
hassoaac372f2005-09-01 17:52:33 +0000108 area = XCALLOC (MTYPE_ISIS_AREA, sizeof (struct isis_area));
jardineb5d44e2003-12-23 08:09:43 +0000109
110 /*
111 * The first instance is level-1-2 rest are level-1, unless otherwise
112 * configured
113 */
114 if (listcount (isis->area_list) > 0)
115 area->is_type = IS_LEVEL_1;
116 else
117 area->is_type = IS_LEVEL_1_AND_2;
Josh Bailey3f045a02012-03-24 08:35:20 -0700118
jardineb5d44e2003-12-23 08:09:43 +0000119 /*
120 * intialize the databases
121 */
Josh Bailey3f045a02012-03-24 08:35:20 -0700122 if (area->is_type & IS_LEVEL_1)
123 {
124 area->lspdb[0] = lsp_db_init ();
125 area->route_table[0] = route_table_init ();
126#ifdef HAVE_IPV6
127 area->route_table6[0] = route_table_init ();
128#endif /* HAVE_IPV6 */
129 }
130 if (area->is_type & IS_LEVEL_2)
131 {
132 area->lspdb[1] = lsp_db_init ();
133 area->route_table[1] = route_table_init ();
134#ifdef HAVE_IPV6
135 area->route_table6[1] = route_table_init ();
136#endif /* HAVE_IPV6 */
137 }
hassof390d2c2004-09-10 20:48:21 +0000138
jardineb5d44e2003-12-23 08:09:43 +0000139 spftree_area_init (area);
Josh Bailey3f045a02012-03-24 08:35:20 -0700140
jardineb5d44e2003-12-23 08:09:43 +0000141 area->circuit_list = list_new ();
142 area->area_addrs = list_new ();
hassof390d2c2004-09-10 20:48:21 +0000143 THREAD_TIMER_ON (master, area->t_tick, lsp_tick, area, 1);
Paul Jakmac7350c42008-01-29 19:29:44 +0000144 flags_initialize (&area->flags);
Josh Bailey3f045a02012-03-24 08:35:20 -0700145
jardineb5d44e2003-12-23 08:09:43 +0000146 /*
147 * Default values
148 */
Josh Bailey3f045a02012-03-24 08:35:20 -0700149 area->max_lsp_lifetime[0] = DEFAULT_LSP_LIFETIME; /* 1200 */
150 area->max_lsp_lifetime[1] = DEFAULT_LSP_LIFETIME; /* 1200 */
151 area->lsp_refresh[0] = DEFAULT_MAX_LSP_GEN_INTERVAL; /* 900 */
152 area->lsp_refresh[1] = DEFAULT_MAX_LSP_GEN_INTERVAL; /* 900 */
153 area->lsp_gen_interval[0] = DEFAULT_MIN_LSP_GEN_INTERVAL;
154 area->lsp_gen_interval[1] = DEFAULT_MIN_LSP_GEN_INTERVAL;
jardineb5d44e2003-12-23 08:09:43 +0000155 area->min_spf_interval[0] = MINIMUM_SPF_INTERVAL;
156 area->min_spf_interval[1] = MINIMUM_SPF_INTERVAL;
157 area->dynhostname = 1;
Josh Bailey3f045a02012-03-24 08:35:20 -0700158 area->oldmetric = 0;
159 area->newmetric = 1;
jardineb5d44e2003-12-23 08:09:43 +0000160 area->lsp_frag_threshold = 90;
161#ifdef TOPOLOGY_GENERATE
162 memcpy (area->topology_baseis, DEFAULT_TOPOLOGY_BASEIS, ISIS_SYS_ID_LEN);
163#endif /* TOPOLOGY_GENERATE */
164
165 /* FIXME: Think of a better way... */
166 area->min_bcast_mtu = 1497;
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
285 for (ALL_LIST_ELEMENTS (area->area_addrs, node, nnode, addr))
286 {
287 list_delete_node (area->area_addrs, node);
288 XFREE (MTYPE_ISIS_AREA_ADDR, addr);
289 }
290 area->area_addrs = NULL;
291
hassof390d2c2004-09-10 20:48:21 +0000292 THREAD_TIMER_OFF (area->t_tick);
hassof390d2c2004-09-10 20:48:21 +0000293 THREAD_TIMER_OFF (area->t_lsp_refresh[0]);
294 THREAD_TIMER_OFF (area->t_lsp_refresh[1]);
jardineb5d44e2003-12-23 08:09:43 +0000295
Josh Bailey3f045a02012-03-24 08:35:20 -0700296 thread_cancel_event (master, area);
297
298 listnode_delete (isis->area_list, area);
299
300 free (area->area_tag);
301
jardineb5d44e2003-12-23 08:09:43 +0000302 XFREE (MTYPE_ISIS_AREA, area);
hassof390d2c2004-09-10 20:48:21 +0000303
Josh Bailey3f045a02012-03-24 08:35:20 -0700304 if (listcount (isis->area_list) == 0)
305 {
306 memset (isis->sysid, 0, ISIS_SYS_ID_LEN);
307 isis->sysid_set = 0;
308 }
309
jardineb5d44e2003-12-23 08:09:43 +0000310 return CMD_SUCCESS;
311}
312
hassof390d2c2004-09-10 20:48:21 +0000313int
Josh Bailey3f045a02012-03-24 08:35:20 -0700314area_net_title (struct vty *vty, const char *net_title)
jardineb5d44e2003-12-23 08:09:43 +0000315{
jardineb5d44e2003-12-23 08:09:43 +0000316 struct isis_area *area;
317 struct area_addr *addr;
318 struct area_addr *addrp;
hasso3fdb2dd2005-09-28 18:45:54 +0000319 struct listnode *node;
jardineb5d44e2003-12-23 08:09:43 +0000320
321 u_char buff[255];
322 area = vty->index;
323
hassof390d2c2004-09-10 20:48:21 +0000324 if (!area)
325 {
326 vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE);
Josh Bailey3f045a02012-03-24 08:35:20 -0700327 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +0000328 }
jardineb5d44e2003-12-23 08:09:43 +0000329
330 /* We check that we are not over the maximal number of addresses */
hassof390d2c2004-09-10 20:48:21 +0000331 if (listcount (area->area_addrs) >= isis->max_area_addrs)
332 {
333 vty_out (vty, "Maximum of area addresses (%d) already reached %s",
334 isis->max_area_addrs, VTY_NEWLINE);
Josh Bailey3f045a02012-03-24 08:35:20 -0700335 return CMD_ERR_NOTHING_TODO;
hassof390d2c2004-09-10 20:48:21 +0000336 }
jardineb5d44e2003-12-23 08:09:43 +0000337
338 addr = XMALLOC (MTYPE_ISIS_AREA_ADDR, sizeof (struct area_addr));
339 addr->addr_len = dotformat2buff (buff, net_title);
340 memcpy (addr->area_addr, buff, addr->addr_len);
341#ifdef EXTREME_DEBUG
hasso529d65b2004-12-24 00:14:50 +0000342 zlog_debug ("added area address %s for area %s (address length %d)",
jardineb5d44e2003-12-23 08:09:43 +0000343 net_title, area->area_tag, addr->addr_len);
344#endif /* EXTREME_DEBUG */
hassof390d2c2004-09-10 20:48:21 +0000345 if (addr->addr_len < 8 || addr->addr_len > 20)
346 {
Josh Bailey3f045a02012-03-24 08:35:20 -0700347 vty_out (vty, "area address must be at least 8..20 octets long (%d)%s",
348 addr->addr_len, VTY_NEWLINE);
jardineb5d44e2003-12-23 08:09:43 +0000349 XFREE (MTYPE_ISIS_AREA_ADDR, addr);
Josh Bailey3f045a02012-03-24 08:35:20 -0700350 return CMD_ERR_AMBIGUOUS;
351 }
352
353 if (addr->area_addr[addr->addr_len-1] != 0)
354 {
355 vty_out (vty, "nsel byte (last byte) in area address must be 0%s",
356 VTY_NEWLINE);
357 XFREE (MTYPE_ISIS_AREA_ADDR, addr);
358 return CMD_ERR_AMBIGUOUS;
jardineb5d44e2003-12-23 08:09:43 +0000359 }
360
hassof390d2c2004-09-10 20:48:21 +0000361 if (isis->sysid_set == 0)
362 {
363 /*
364 * First area address - get the SystemID for this router
365 */
Josh Bailey3f045a02012-03-24 08:35:20 -0700366 memcpy (isis->sysid, GETSYSID (addr), ISIS_SYS_ID_LEN);
hassof390d2c2004-09-10 20:48:21 +0000367 isis->sysid_set = 1;
hassoc89c05d2005-09-04 21:36:36 +0000368 if (isis->debugs & DEBUG_EVENTS)
369 zlog_debug ("Router has SystemID %s", sysid_print (isis->sysid));
jardineb5d44e2003-12-23 08:09:43 +0000370 }
hassof390d2c2004-09-10 20:48:21 +0000371 else
372 {
373 /*
374 * Check that the SystemID portions match
375 */
Josh Bailey3f045a02012-03-24 08:35:20 -0700376 if (memcmp (isis->sysid, GETSYSID (addr), ISIS_SYS_ID_LEN))
hassof390d2c2004-09-10 20:48:21 +0000377 {
378 vty_out (vty,
379 "System ID must not change when defining additional area"
380 " addresses%s", VTY_NEWLINE);
381 XFREE (MTYPE_ISIS_AREA_ADDR, addr);
Josh Bailey3f045a02012-03-24 08:35:20 -0700382 return CMD_ERR_AMBIGUOUS;
hassof390d2c2004-09-10 20:48:21 +0000383 }
jardineb5d44e2003-12-23 08:09:43 +0000384
hassof390d2c2004-09-10 20:48:21 +0000385 /* now we see that we don't already have this address */
hasso3fdb2dd2005-09-28 18:45:54 +0000386 for (ALL_LIST_ELEMENTS_RO (area->area_addrs, node, addrp))
387 {
Josh Bailey3f045a02012-03-24 08:35:20 -0700388 if ((addrp->addr_len + ISIS_SYS_ID_LEN + ISIS_NSEL_LEN) != (addr->addr_len))
hasso3fdb2dd2005-09-28 18:45:54 +0000389 continue;
390 if (!memcmp (addrp->area_addr, addr->area_addr, addr->addr_len))
391 {
392 XFREE (MTYPE_ISIS_AREA_ADDR, addr);
393 return CMD_SUCCESS; /* silent fail */
394 }
395 }
hassof390d2c2004-09-10 20:48:21 +0000396 }
Josh Bailey3f045a02012-03-24 08:35:20 -0700397
jardineb5d44e2003-12-23 08:09:43 +0000398 /*
399 * Forget the systemID part of the address
400 */
Josh Bailey3f045a02012-03-24 08:35:20 -0700401 addr->addr_len -= (ISIS_SYS_ID_LEN + ISIS_NSEL_LEN);
jardineb5d44e2003-12-23 08:09:43 +0000402 listnode_add (area->area_addrs, addr);
403
404 /* only now we can safely generate our LSPs for this area */
hassof390d2c2004-09-10 20:48:21 +0000405 if (listcount (area->area_addrs) > 0)
406 {
Josh Bailey3f045a02012-03-24 08:35:20 -0700407 if (area->is_type & IS_LEVEL_1)
408 lsp_generate (area, IS_LEVEL_1);
409 if (area->is_type & IS_LEVEL_2)
410 lsp_generate (area, IS_LEVEL_2);
hassof390d2c2004-09-10 20:48:21 +0000411 }
jardineb5d44e2003-12-23 08:09:43 +0000412
413 return CMD_SUCCESS;
414}
415
416int
Josh Bailey3f045a02012-03-24 08:35:20 -0700417area_clear_net_title (struct vty *vty, const char *net_title)
jardineb5d44e2003-12-23 08:09:43 +0000418{
419 struct isis_area *area;
hassof390d2c2004-09-10 20:48:21 +0000420 struct area_addr addr, *addrp = NULL;
hasso3fdb2dd2005-09-28 18:45:54 +0000421 struct listnode *node;
jardineb5d44e2003-12-23 08:09:43 +0000422 u_char buff[255];
423
424 area = vty->index;
hassof390d2c2004-09-10 20:48:21 +0000425 if (!area)
426 {
427 vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE);
Josh Bailey3f045a02012-03-24 08:35:20 -0700428 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +0000429 }
430
jardineb5d44e2003-12-23 08:09:43 +0000431 addr.addr_len = dotformat2buff (buff, net_title);
hassof390d2c2004-09-10 20:48:21 +0000432 if (addr.addr_len < 8 || addr.addr_len > 20)
433 {
434 vty_out (vty, "Unsupported area address length %d, should be 8...20 %s",
435 addr.addr_len, VTY_NEWLINE);
Josh Bailey3f045a02012-03-24 08:35:20 -0700436 return CMD_ERR_AMBIGUOUS;
hassof390d2c2004-09-10 20:48:21 +0000437 }
438
439 memcpy (addr.area_addr, buff, (int) addr.addr_len);
440
hasso3fdb2dd2005-09-28 18:45:54 +0000441 for (ALL_LIST_ELEMENTS_RO (area->area_addrs, node, addrp))
Josh Bailey3f045a02012-03-24 08:35:20 -0700442 if ((addrp->addr_len + ISIS_SYS_ID_LEN + 1) == addr.addr_len &&
jardineb5d44e2003-12-23 08:09:43 +0000443 !memcmp (addrp->area_addr, addr.area_addr, addr.addr_len))
hassof390d2c2004-09-10 20:48:21 +0000444 break;
445
446 if (!addrp)
447 {
448 vty_out (vty, "No area address %s for area %s %s", net_title,
449 area->area_tag, VTY_NEWLINE);
Josh Bailey3f045a02012-03-24 08:35:20 -0700450 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +0000451 }
452
jardineb5d44e2003-12-23 08:09:43 +0000453 listnode_delete (area->area_addrs, addrp);
Josh Bailey3f045a02012-03-24 08:35:20 -0700454 XFREE (MTYPE_ISIS_AREA_ADDR, addrp);
455
456 /*
457 * Last area address - reset the SystemID for this router
458 */
459 if (listcount (area->area_addrs) == 0)
460 {
461 memset (isis->sysid, 0, ISIS_SYS_ID_LEN);
462 isis->sysid_set = 0;
463 if (isis->debugs & DEBUG_EVENTS)
464 zlog_debug ("Router has no SystemID");
465 }
hassof390d2c2004-09-10 20:48:21 +0000466
jardineb5d44e2003-12-23 08:09:43 +0000467 return CMD_SUCCESS;
468}
469
jardineb5d44e2003-12-23 08:09:43 +0000470/*
Josh Bailey3f045a02012-03-24 08:35:20 -0700471 * 'show isis interface' command
jardineb5d44e2003-12-23 08:09:43 +0000472 */
473
474int
Josh Bailey3f045a02012-03-24 08:35:20 -0700475show_isis_interface_common (struct vty *vty, const char *ifname, char detail)
jardineb5d44e2003-12-23 08:09:43 +0000476{
hasso3fdb2dd2005-09-28 18:45:54 +0000477 struct listnode *anode, *cnode;
jardineb5d44e2003-12-23 08:09:43 +0000478 struct isis_area *area;
479 struct isis_circuit *circuit;
jardineb5d44e2003-12-23 08:09:43 +0000480
hassof390d2c2004-09-10 20:48:21 +0000481 if (!isis)
482 {
483 vty_out (vty, "IS-IS Routing Process not enabled%s", VTY_NEWLINE);
484 return CMD_SUCCESS;
485 }
jardineb5d44e2003-12-23 08:09:43 +0000486
hasso3fdb2dd2005-09-28 18:45:54 +0000487 for (ALL_LIST_ELEMENTS_RO (isis->area_list, anode, area))
hassof390d2c2004-09-10 20:48:21 +0000488 {
hassof390d2c2004-09-10 20:48:21 +0000489 vty_out (vty, "Area %s:%s", area->area_tag, VTY_NEWLINE);
jardineb5d44e2003-12-23 08:09:43 +0000490
hassof390d2c2004-09-10 20:48:21 +0000491 if (detail == ISIS_UI_LEVEL_BRIEF)
Josh Bailey3f045a02012-03-24 08:35:20 -0700492 vty_out (vty, " Interface CircId State Type Level%s",
493 VTY_NEWLINE);
jardineb5d44e2003-12-23 08:09:43 +0000494
hasso3fdb2dd2005-09-28 18:45:54 +0000495 for (ALL_LIST_ELEMENTS_RO (area->circuit_list, cnode, circuit))
Josh Bailey3f045a02012-03-24 08:35:20 -0700496 if (!ifname)
497 isis_circuit_print_vty (circuit, vty, detail);
498 else if (strcmp(circuit->interface->name, ifname) == 0)
499 isis_circuit_print_vty (circuit, vty, detail);
jardineb5d44e2003-12-23 08:09:43 +0000500 }
hassof390d2c2004-09-10 20:48:21 +0000501
jardineb5d44e2003-12-23 08:09:43 +0000502 return CMD_SUCCESS;
503}
504
Josh Bailey3f045a02012-03-24 08:35:20 -0700505DEFUN (show_isis_interface,
506 show_isis_interface_cmd,
507 "show isis interface",
jardineb5d44e2003-12-23 08:09:43 +0000508 SHOW_STR
Josh Bailey3f045a02012-03-24 08:35:20 -0700509 "ISIS network information\n"
510 "ISIS interface\n")
jardineb5d44e2003-12-23 08:09:43 +0000511{
Josh Bailey3f045a02012-03-24 08:35:20 -0700512 return show_isis_interface_common (vty, NULL, ISIS_UI_LEVEL_BRIEF);
jardineb5d44e2003-12-23 08:09:43 +0000513}
514
Josh Bailey3f045a02012-03-24 08:35:20 -0700515DEFUN (show_isis_interface_detail,
516 show_isis_interface_detail_cmd,
517 "show isis interface detail",
jardineb5d44e2003-12-23 08:09:43 +0000518 SHOW_STR
Josh Bailey3f045a02012-03-24 08:35:20 -0700519 "ISIS network information\n"
520 "ISIS interface\n"
jardineb5d44e2003-12-23 08:09:43 +0000521 "show detailed information\n")
522{
Josh Bailey3f045a02012-03-24 08:35:20 -0700523 return show_isis_interface_common (vty, NULL, ISIS_UI_LEVEL_DETAIL);
jardineb5d44e2003-12-23 08:09:43 +0000524}
525
Josh Bailey3f045a02012-03-24 08:35:20 -0700526DEFUN (show_isis_interface_arg,
527 show_isis_interface_arg_cmd,
528 "show isis interface WORD",
jardineb5d44e2003-12-23 08:09:43 +0000529 SHOW_STR
Josh Bailey3f045a02012-03-24 08:35:20 -0700530 "ISIS network information\n"
531 "ISIS interface\n"
532 "ISIS interface name\n")
533{
534 return show_isis_interface_common (vty, argv[0], ISIS_UI_LEVEL_DETAIL);
535}
536
537/*
538 * 'show isis neighbor' command
539 */
540
541int
542show_isis_neighbor_common (struct vty *vty, const char *id, char detail)
543{
544 struct listnode *anode, *cnode, *node;
545 struct isis_area *area;
546 struct isis_circuit *circuit;
547 struct list *adjdb;
548 struct isis_adjacency *adj;
549 struct isis_dynhn *dynhn;
550 u_char sysid[ISIS_SYS_ID_LEN];
551 int i;
552
553 if (!isis)
554 {
555 vty_out (vty, "IS-IS Routing Process not enabled%s", VTY_NEWLINE);
556 return CMD_SUCCESS;
557 }
558
559 memset (sysid, 0, ISIS_SYS_ID_LEN);
560 if (id)
561 {
562 if (sysid2buff (sysid, id) == 0)
563 {
564 dynhn = dynhn_find_by_name (id);
565 if (dynhn == NULL)
566 {
567 vty_out (vty, "Invalid system id %s%s", id, VTY_NEWLINE);
568 return CMD_SUCCESS;
569 }
570 memcpy (sysid, dynhn->id, ISIS_SYS_ID_LEN);
571 }
572 }
573
574 for (ALL_LIST_ELEMENTS_RO (isis->area_list, anode, area))
575 {
576 vty_out (vty, "Area %s:%s", area->area_tag, VTY_NEWLINE);
577
578 if (detail == ISIS_UI_LEVEL_BRIEF)
579 vty_out (vty, " System Id Interface L State"
580 " Holdtime SNPA%s", VTY_NEWLINE);
581
582 for (ALL_LIST_ELEMENTS_RO (area->circuit_list, cnode, circuit))
583 {
584 if (circuit->circ_type == CIRCUIT_T_BROADCAST)
585 {
586 for (i = 0; i < 2; i++)
587 {
588 adjdb = circuit->u.bc.adjdb[i];
589 if (adjdb && adjdb->count)
590 {
591 for (ALL_LIST_ELEMENTS_RO (adjdb, node, adj))
592 if (!id || !memcmp (adj->sysid, sysid,
593 ISIS_SYS_ID_LEN))
594 isis_adj_print_vty (adj, vty, detail);
595 }
596 }
597 }
598 else if (circuit->circ_type == CIRCUIT_T_P2P &&
599 circuit->u.p2p.neighbor)
600 {
601 adj = circuit->u.p2p.neighbor;
602 if (!id || !memcmp (adj->sysid, sysid, ISIS_SYS_ID_LEN))
603 isis_adj_print_vty (adj, vty, detail);
604 }
605 }
606 }
607
608 return CMD_SUCCESS;
609}
610
611/*
612 * 'clear isis neighbor' command
613 */
614int
615clear_isis_neighbor_common (struct vty *vty, const char *id)
616{
617 struct listnode *anode, *cnode, *cnextnode, *node, *nnode;
618 struct isis_area *area;
619 struct isis_circuit *circuit;
620 struct list *adjdb;
621 struct isis_adjacency *adj;
622 struct isis_dynhn *dynhn;
623 u_char sysid[ISIS_SYS_ID_LEN];
624 int i;
625
626 if (!isis)
627 {
628 vty_out (vty, "IS-IS Routing Process not enabled%s", VTY_NEWLINE);
629 return CMD_SUCCESS;
630 }
631
632 memset (sysid, 0, ISIS_SYS_ID_LEN);
633 if (id)
634 {
635 if (sysid2buff (sysid, id) == 0)
636 {
637 dynhn = dynhn_find_by_name (id);
638 if (dynhn == NULL)
639 {
640 vty_out (vty, "Invalid system id %s%s", id, VTY_NEWLINE);
641 return CMD_SUCCESS;
642 }
643 memcpy (sysid, dynhn->id, ISIS_SYS_ID_LEN);
644 }
645 }
646
647 for (ALL_LIST_ELEMENTS_RO (isis->area_list, anode, area))
648 {
649 for (ALL_LIST_ELEMENTS (area->circuit_list, cnode, cnextnode, circuit))
650 {
651 if (circuit->circ_type == CIRCUIT_T_BROADCAST)
652 {
653 for (i = 0; i < 2; i++)
654 {
655 adjdb = circuit->u.bc.adjdb[i];
656 if (adjdb && adjdb->count)
657 {
658 for (ALL_LIST_ELEMENTS (adjdb, node, nnode, adj))
659 if (!id || !memcmp (adj->sysid, sysid, ISIS_SYS_ID_LEN))
660 isis_adj_state_change (adj, ISIS_ADJ_DOWN,
661 "clear user request");
662 }
663 }
664 }
665 else if (circuit->circ_type == CIRCUIT_T_P2P &&
666 circuit->u.p2p.neighbor)
667 {
668 adj = circuit->u.p2p.neighbor;
669 if (!id || !memcmp (adj->sysid, sysid, ISIS_SYS_ID_LEN))
670 isis_adj_state_change (adj, ISIS_ADJ_DOWN,
671 "clear user request");
672 }
673 }
674 }
675
676 return CMD_SUCCESS;
677}
678
679DEFUN (show_isis_neighbor,
680 show_isis_neighbor_cmd,
681 "show isis neighbor",
682 SHOW_STR
683 "ISIS network information\n"
684 "ISIS neighbor adjacencies\n")
685{
686 return show_isis_neighbor_common (vty, NULL, ISIS_UI_LEVEL_BRIEF);
687}
688
689DEFUN (show_isis_neighbor_detail,
690 show_isis_neighbor_detail_cmd,
691 "show isis neighbor detail",
692 SHOW_STR
693 "ISIS network information\n"
694 "ISIS neighbor adjacencies\n"
jardineb5d44e2003-12-23 08:09:43 +0000695 "show detailed information\n")
Josh Bailey3f045a02012-03-24 08:35:20 -0700696{
697 return show_isis_neighbor_common (vty, NULL, ISIS_UI_LEVEL_DETAIL);
698}
699
700DEFUN (show_isis_neighbor_arg,
701 show_isis_neighbor_arg_cmd,
702 "show isis neighbor WORD",
703 SHOW_STR
704 "ISIS network information\n"
705 "ISIS neighbor adjacencies\n"
706 "System id\n")
707{
708 return show_isis_neighbor_common (vty, argv[0], ISIS_UI_LEVEL_DETAIL);
709}
710
711DEFUN (clear_isis_neighbor,
712 clear_isis_neighbor_cmd,
713 "clear isis neighbor",
714 CLEAR_STR
715 "Reset ISIS network information\n"
716 "Reset ISIS neighbor adjacencies\n")
717{
718 return clear_isis_neighbor_common (vty, NULL);
719}
720
721DEFUN (clear_isis_neighbor_arg,
722 clear_isis_neighbor_arg_cmd,
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -0700723 "clear isis neighbor WORD",
Josh Bailey3f045a02012-03-24 08:35:20 -0700724 CLEAR_STR
725 "ISIS network information\n"
726 "ISIS neighbor adjacencies\n"
727 "System id\n")
728{
729 return clear_isis_neighbor_common (vty, argv[0]);
730}
731
jardineb5d44e2003-12-23 08:09:43 +0000732/*
733 * 'isis debug', 'show debugging'
734 */
jardineb5d44e2003-12-23 08:09:43 +0000735void
736print_debug (struct vty *vty, int flags, int onoff)
737{
738 char onoffs[4];
739 if (onoff)
hassof390d2c2004-09-10 20:48:21 +0000740 strcpy (onoffs, "on");
jardineb5d44e2003-12-23 08:09:43 +0000741 else
hassof390d2c2004-09-10 20:48:21 +0000742 strcpy (onoffs, "off");
jardineb5d44e2003-12-23 08:09:43 +0000743
744 if (flags & DEBUG_ADJ_PACKETS)
hassof390d2c2004-09-10 20:48:21 +0000745 vty_out (vty, "IS-IS Adjacency related packets debugging is %s%s", onoffs,
746 VTY_NEWLINE);
jardineb5d44e2003-12-23 08:09:43 +0000747 if (flags & DEBUG_CHECKSUM_ERRORS)
hassof390d2c2004-09-10 20:48:21 +0000748 vty_out (vty, "IS-IS checksum errors debugging is %s%s", onoffs,
749 VTY_NEWLINE);
jardineb5d44e2003-12-23 08:09:43 +0000750 if (flags & DEBUG_LOCAL_UPDATES)
hassof390d2c2004-09-10 20:48:21 +0000751 vty_out (vty, "IS-IS local updates debugging is %s%s", onoffs,
752 VTY_NEWLINE);
jardineb5d44e2003-12-23 08:09:43 +0000753 if (flags & DEBUG_PROTOCOL_ERRORS)
hassof390d2c2004-09-10 20:48:21 +0000754 vty_out (vty, "IS-IS protocol errors debugging is %s%s", onoffs,
755 VTY_NEWLINE);
jardineb5d44e2003-12-23 08:09:43 +0000756 if (flags & DEBUG_SNP_PACKETS)
hassof390d2c2004-09-10 20:48:21 +0000757 vty_out (vty, "IS-IS CSNP/PSNP packets debugging is %s%s", onoffs,
758 VTY_NEWLINE);
jardineb5d44e2003-12-23 08:09:43 +0000759 if (flags & DEBUG_SPF_EVENTS)
hassof390d2c2004-09-10 20:48:21 +0000760 vty_out (vty, "IS-IS SPF events debugging is %s%s", onoffs, VTY_NEWLINE);
jardineb5d44e2003-12-23 08:09:43 +0000761 if (flags & DEBUG_SPF_STATS)
hassof390d2c2004-09-10 20:48:21 +0000762 vty_out (vty, "IS-IS SPF Timing and Statistics Data debugging is %s%s",
763 onoffs, VTY_NEWLINE);
jardineb5d44e2003-12-23 08:09:43 +0000764 if (flags & DEBUG_SPF_TRIGGERS)
hassof390d2c2004-09-10 20:48:21 +0000765 vty_out (vty, "IS-IS SPF triggering events debugging is %s%s", onoffs,
766 VTY_NEWLINE);
jardineb5d44e2003-12-23 08:09:43 +0000767 if (flags & DEBUG_UPDATE_PACKETS)
hassof390d2c2004-09-10 20:48:21 +0000768 vty_out (vty, "IS-IS Update related packet debugging is %s%s", onoffs,
769 VTY_NEWLINE);
jardineb5d44e2003-12-23 08:09:43 +0000770 if (flags & DEBUG_RTE_EVENTS)
hassof390d2c2004-09-10 20:48:21 +0000771 vty_out (vty, "IS-IS Route related debuggin is %s%s", onoffs,
772 VTY_NEWLINE);
jardineb5d44e2003-12-23 08:09:43 +0000773 if (flags & DEBUG_EVENTS)
hassof390d2c2004-09-10 20:48:21 +0000774 vty_out (vty, "IS-IS Event debugging is %s%s", onoffs, VTY_NEWLINE);
Josh Bailey3f045a02012-03-24 08:35:20 -0700775 if (flags & DEBUG_PACKET_DUMP)
776 vty_out (vty, "IS-IS Packet dump debugging is %s%s", onoffs, VTY_NEWLINE);
jardineb5d44e2003-12-23 08:09:43 +0000777}
778
779DEFUN (show_debugging,
780 show_debugging_cmd,
781 "show debugging",
782 SHOW_STR
783 "State of each debugging option\n")
784{
hassof390d2c2004-09-10 20:48:21 +0000785 vty_out (vty, "IS-IS:%s", VTY_NEWLINE);
jardineb5d44e2003-12-23 08:09:43 +0000786 print_debug (vty, isis->debugs, 1);
787 return CMD_SUCCESS;
788}
789
jardin9e867fe2003-12-23 08:56:18 +0000790/* Debug node. */
hassof390d2c2004-09-10 20:48:21 +0000791static struct cmd_node debug_node = {
jardin9e867fe2003-12-23 08:56:18 +0000792 DEBUG_NODE,
hassof390d2c2004-09-10 20:48:21 +0000793 "",
794 1
jardin9e867fe2003-12-23 08:56:18 +0000795};
796
797static int
798config_write_debug (struct vty *vty)
799{
800 int write = 0;
801 int flags = isis->debugs;
802
hassof390d2c2004-09-10 20:48:21 +0000803 if (flags & DEBUG_ADJ_PACKETS)
804 {
805 vty_out (vty, "debug isis adj-packets%s", VTY_NEWLINE);
806 write++;
807 }
808 if (flags & DEBUG_CHECKSUM_ERRORS)
809 {
810 vty_out (vty, "debug isis checksum-errors%s", VTY_NEWLINE);
811 write++;
812 }
813 if (flags & DEBUG_LOCAL_UPDATES)
814 {
815 vty_out (vty, "debug isis local-updates%s", VTY_NEWLINE);
816 write++;
817 }
818 if (flags & DEBUG_PROTOCOL_ERRORS)
819 {
820 vty_out (vty, "debug isis protocol-errors%s", VTY_NEWLINE);
821 write++;
822 }
823 if (flags & DEBUG_SNP_PACKETS)
824 {
825 vty_out (vty, "debug isis snp-packets%s", VTY_NEWLINE);
826 write++;
827 }
828 if (flags & DEBUG_SPF_EVENTS)
829 {
830 vty_out (vty, "debug isis spf-events%s", VTY_NEWLINE);
831 write++;
832 }
833 if (flags & DEBUG_SPF_STATS)
834 {
835 vty_out (vty, "debug isis spf-statistics%s", VTY_NEWLINE);
836 write++;
837 }
838 if (flags & DEBUG_SPF_TRIGGERS)
839 {
840 vty_out (vty, "debug isis spf-triggers%s", VTY_NEWLINE);
841 write++;
842 }
843 if (flags & DEBUG_UPDATE_PACKETS)
844 {
845 vty_out (vty, "debug isis update-packets%s", VTY_NEWLINE);
846 write++;
847 }
848 if (flags & DEBUG_RTE_EVENTS)
849 {
850 vty_out (vty, "debug isis route-events%s", VTY_NEWLINE);
851 write++;
852 }
853 if (flags & DEBUG_EVENTS)
854 {
855 vty_out (vty, "debug isis events%s", VTY_NEWLINE);
856 write++;
857 }
Josh Bailey3f045a02012-03-24 08:35:20 -0700858 if (flags & DEBUG_PACKET_DUMP)
859 {
860 vty_out (vty, "debug isis packet-dump%s", VTY_NEWLINE);
861 write++;
862 }
jardin9e867fe2003-12-23 08:56:18 +0000863
864 return write;
865}
866
jardineb5d44e2003-12-23 08:09:43 +0000867DEFUN (debug_isis_adj,
868 debug_isis_adj_cmd,
869 "debug isis adj-packets",
870 DEBUG_STR
871 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +0000872 "IS-IS Adjacency related packets\n")
jardineb5d44e2003-12-23 08:09:43 +0000873{
874 isis->debugs |= DEBUG_ADJ_PACKETS;
hassof390d2c2004-09-10 20:48:21 +0000875 print_debug (vty, DEBUG_ADJ_PACKETS, 1);
jardineb5d44e2003-12-23 08:09:43 +0000876
877 return CMD_SUCCESS;
878}
879
880DEFUN (no_debug_isis_adj,
881 no_debug_isis_adj_cmd,
882 "no debug isis adj-packets",
883 UNDEBUG_STR
884 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +0000885 "IS-IS Adjacency related packets\n")
jardineb5d44e2003-12-23 08:09:43 +0000886{
jardineb5d44e2003-12-23 08:09:43 +0000887 isis->debugs &= ~DEBUG_ADJ_PACKETS;
888 print_debug (vty, DEBUG_ADJ_PACKETS, 0);
889
890 return CMD_SUCCESS;
891}
892
jardineb5d44e2003-12-23 08:09:43 +0000893DEFUN (debug_isis_csum,
894 debug_isis_csum_cmd,
895 "debug isis checksum-errors",
896 DEBUG_STR
897 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +0000898 "IS-IS LSP checksum errors\n")
jardineb5d44e2003-12-23 08:09:43 +0000899{
900 isis->debugs |= DEBUG_CHECKSUM_ERRORS;
901 print_debug (vty, DEBUG_CHECKSUM_ERRORS, 1);
902
903 return CMD_SUCCESS;
904}
905
906DEFUN (no_debug_isis_csum,
907 no_debug_isis_csum_cmd,
908 "no debug isis checksum-errors",
909 UNDEBUG_STR
910 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +0000911 "IS-IS LSP checksum errors\n")
jardineb5d44e2003-12-23 08:09:43 +0000912{
913 isis->debugs &= ~DEBUG_CHECKSUM_ERRORS;
914 print_debug (vty, DEBUG_CHECKSUM_ERRORS, 0);
hassof390d2c2004-09-10 20:48:21 +0000915
jardineb5d44e2003-12-23 08:09:43 +0000916 return CMD_SUCCESS;
917}
918
919DEFUN (debug_isis_lupd,
920 debug_isis_lupd_cmd,
921 "debug isis local-updates",
922 DEBUG_STR
923 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +0000924 "IS-IS local update packets\n")
jardineb5d44e2003-12-23 08:09:43 +0000925{
926 isis->debugs |= DEBUG_LOCAL_UPDATES;
927 print_debug (vty, DEBUG_LOCAL_UPDATES, 1);
928
929 return CMD_SUCCESS;
930}
931
932DEFUN (no_debug_isis_lupd,
933 no_debug_isis_lupd_cmd,
934 "no debug isis local-updates",
935 UNDEBUG_STR
936 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +0000937 "IS-IS local update packets\n")
jardineb5d44e2003-12-23 08:09:43 +0000938{
939 isis->debugs &= ~DEBUG_LOCAL_UPDATES;
hassof390d2c2004-09-10 20:48:21 +0000940 print_debug (vty, DEBUG_LOCAL_UPDATES, 0);
941
jardineb5d44e2003-12-23 08:09:43 +0000942 return CMD_SUCCESS;
943}
944
945DEFUN (debug_isis_err,
946 debug_isis_err_cmd,
hassof390d2c2004-09-10 20:48:21 +0000947 "debug isis protocol-errors",
jardineb5d44e2003-12-23 08:09:43 +0000948 DEBUG_STR
949 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +0000950 "IS-IS LSP protocol errors\n")
jardineb5d44e2003-12-23 08:09:43 +0000951{
952 isis->debugs |= DEBUG_PROTOCOL_ERRORS;
953 print_debug (vty, DEBUG_PROTOCOL_ERRORS, 1);
954
955 return CMD_SUCCESS;
956}
957
958DEFUN (no_debug_isis_err,
959 no_debug_isis_err_cmd,
960 "no debug isis protocol-errors",
961 UNDEBUG_STR
962 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +0000963 "IS-IS LSP protocol errors\n")
jardineb5d44e2003-12-23 08:09:43 +0000964{
965 isis->debugs &= ~DEBUG_PROTOCOL_ERRORS;
966 print_debug (vty, DEBUG_PROTOCOL_ERRORS, 0);
hassof390d2c2004-09-10 20:48:21 +0000967
jardineb5d44e2003-12-23 08:09:43 +0000968 return CMD_SUCCESS;
969}
970
971DEFUN (debug_isis_snp,
972 debug_isis_snp_cmd,
973 "debug isis snp-packets",
974 DEBUG_STR
975 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +0000976 "IS-IS CSNP/PSNP packets\n")
jardineb5d44e2003-12-23 08:09:43 +0000977{
978 isis->debugs |= DEBUG_SNP_PACKETS;
979 print_debug (vty, DEBUG_SNP_PACKETS, 1);
980
981 return CMD_SUCCESS;
982}
983
984DEFUN (no_debug_isis_snp,
985 no_debug_isis_snp_cmd,
986 "no debug isis snp-packets",
987 UNDEBUG_STR
988 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +0000989 "IS-IS CSNP/PSNP packets\n")
jardineb5d44e2003-12-23 08:09:43 +0000990{
hassof390d2c2004-09-10 20:48:21 +0000991 isis->debugs &= ~DEBUG_SNP_PACKETS;
jardineb5d44e2003-12-23 08:09:43 +0000992 print_debug (vty, DEBUG_SNP_PACKETS, 0);
hassof390d2c2004-09-10 20:48:21 +0000993
jardineb5d44e2003-12-23 08:09:43 +0000994 return CMD_SUCCESS;
995}
996
jardineb5d44e2003-12-23 08:09:43 +0000997DEFUN (debug_isis_upd,
998 debug_isis_upd_cmd,
999 "debug isis update-packets",
1000 DEBUG_STR
1001 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +00001002 "IS-IS Update related packets\n")
jardineb5d44e2003-12-23 08:09:43 +00001003{
1004 isis->debugs |= DEBUG_UPDATE_PACKETS;
1005 print_debug (vty, DEBUG_UPDATE_PACKETS, 1);
1006
1007 return CMD_SUCCESS;
1008}
1009
1010DEFUN (no_debug_isis_upd,
1011 no_debug_isis_upd_cmd,
1012 "no debug isis update-packets",
1013 UNDEBUG_STR
1014 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +00001015 "IS-IS Update related packets\n")
jardineb5d44e2003-12-23 08:09:43 +00001016{
1017 isis->debugs &= ~DEBUG_UPDATE_PACKETS;
1018 print_debug (vty, DEBUG_UPDATE_PACKETS, 0);
hassof390d2c2004-09-10 20:48:21 +00001019
jardineb5d44e2003-12-23 08:09:43 +00001020 return CMD_SUCCESS;
1021}
1022
jardineb5d44e2003-12-23 08:09:43 +00001023DEFUN (debug_isis_spfevents,
1024 debug_isis_spfevents_cmd,
1025 "debug isis spf-events",
1026 DEBUG_STR
1027 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +00001028 "IS-IS Shortest Path First Events\n")
jardineb5d44e2003-12-23 08:09:43 +00001029{
1030 isis->debugs |= DEBUG_SPF_EVENTS;
hassof390d2c2004-09-10 20:48:21 +00001031 print_debug (vty, DEBUG_SPF_EVENTS, 1);
jardineb5d44e2003-12-23 08:09:43 +00001032
1033 return CMD_SUCCESS;
1034}
1035
1036DEFUN (no_debug_isis_spfevents,
1037 no_debug_isis_spfevents_cmd,
1038 "no debug isis spf-events",
1039 UNDEBUG_STR
1040 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +00001041 "IS-IS Shortest Path First Events\n")
jardineb5d44e2003-12-23 08:09:43 +00001042{
1043 isis->debugs &= ~DEBUG_SPF_EVENTS;
hassof390d2c2004-09-10 20:48:21 +00001044 print_debug (vty, DEBUG_SPF_EVENTS, 0);
1045
jardineb5d44e2003-12-23 08:09:43 +00001046 return CMD_SUCCESS;
1047}
1048
jardineb5d44e2003-12-23 08:09:43 +00001049DEFUN (debug_isis_spfstats,
1050 debug_isis_spfstats_cmd,
1051 "debug isis spf-statistics ",
1052 DEBUG_STR
1053 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +00001054 "IS-IS SPF Timing and Statistic Data\n")
jardineb5d44e2003-12-23 08:09:43 +00001055{
1056 isis->debugs |= DEBUG_SPF_STATS;
1057 print_debug (vty, DEBUG_SPF_STATS, 1);
1058
1059 return CMD_SUCCESS;
1060}
1061
1062DEFUN (no_debug_isis_spfstats,
1063 no_debug_isis_spfstats_cmd,
1064 "no debug isis spf-statistics",
1065 UNDEBUG_STR
1066 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +00001067 "IS-IS SPF Timing and Statistic Data\n")
jardineb5d44e2003-12-23 08:09:43 +00001068{
1069 isis->debugs &= ~DEBUG_SPF_STATS;
1070 print_debug (vty, DEBUG_SPF_STATS, 0);
hassof390d2c2004-09-10 20:48:21 +00001071
jardineb5d44e2003-12-23 08:09:43 +00001072 return CMD_SUCCESS;
1073}
1074
1075DEFUN (debug_isis_spftrigg,
1076 debug_isis_spftrigg_cmd,
1077 "debug isis spf-triggers",
1078 DEBUG_STR
1079 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +00001080 "IS-IS SPF triggering events\n")
jardineb5d44e2003-12-23 08:09:43 +00001081{
1082 isis->debugs |= DEBUG_SPF_TRIGGERS;
1083 print_debug (vty, DEBUG_SPF_TRIGGERS, 1);
1084
1085 return CMD_SUCCESS;
1086}
1087
1088DEFUN (no_debug_isis_spftrigg,
1089 no_debug_isis_spftrigg_cmd,
1090 "no debug isis spf-triggers",
1091 UNDEBUG_STR
1092 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +00001093 "IS-IS SPF triggering events\n")
jardineb5d44e2003-12-23 08:09:43 +00001094{
1095 isis->debugs &= ~DEBUG_SPF_TRIGGERS;
1096 print_debug (vty, DEBUG_SPF_TRIGGERS, 0);
hassof390d2c2004-09-10 20:48:21 +00001097
jardineb5d44e2003-12-23 08:09:43 +00001098 return CMD_SUCCESS;
1099}
1100
1101DEFUN (debug_isis_rtevents,
1102 debug_isis_rtevents_cmd,
1103 "debug isis route-events",
1104 DEBUG_STR
1105 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +00001106 "IS-IS Route related events\n")
jardineb5d44e2003-12-23 08:09:43 +00001107{
1108 isis->debugs |= DEBUG_RTE_EVENTS;
1109 print_debug (vty, DEBUG_RTE_EVENTS, 1);
1110
1111 return CMD_SUCCESS;
1112}
1113
1114DEFUN (no_debug_isis_rtevents,
1115 no_debug_isis_rtevents_cmd,
1116 "no debug isis route-events",
1117 UNDEBUG_STR
1118 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +00001119 "IS-IS Route related events\n")
jardineb5d44e2003-12-23 08:09:43 +00001120{
1121 isis->debugs &= ~DEBUG_RTE_EVENTS;
1122 print_debug (vty, DEBUG_RTE_EVENTS, 0);
hassof390d2c2004-09-10 20:48:21 +00001123
jardineb5d44e2003-12-23 08:09:43 +00001124 return CMD_SUCCESS;
1125}
1126
1127DEFUN (debug_isis_events,
1128 debug_isis_events_cmd,
1129 "debug isis events",
1130 DEBUG_STR
1131 "IS-IS information\n"
hassof1082d12005-09-19 04:23:34 +00001132 "IS-IS Events\n")
jardineb5d44e2003-12-23 08:09:43 +00001133{
1134 isis->debugs |= DEBUG_EVENTS;
1135 print_debug (vty, DEBUG_EVENTS, 1);
1136
1137 return CMD_SUCCESS;
1138}
1139
1140DEFUN (no_debug_isis_events,
1141 no_debug_isis_events_cmd,
1142 "no debug isis events",
1143 UNDEBUG_STR
1144 "IS-IS information\n"
hassof390d2c2004-09-10 20:48:21 +00001145 "IS-IS Events\n")
jardineb5d44e2003-12-23 08:09:43 +00001146{
1147 isis->debugs &= ~DEBUG_EVENTS;
1148 print_debug (vty, DEBUG_EVENTS, 0);
hassof390d2c2004-09-10 20:48:21 +00001149
jardineb5d44e2003-12-23 08:09:43 +00001150 return CMD_SUCCESS;
1151}
1152
Josh Bailey3f045a02012-03-24 08:35:20 -07001153DEFUN (debug_isis_packet_dump,
1154 debug_isis_packet_dump_cmd,
1155 "debug isis packet-dump",
1156 DEBUG_STR
1157 "IS-IS information\n"
1158 "IS-IS packet dump\n")
1159{
1160 isis->debugs |= DEBUG_PACKET_DUMP;
1161 print_debug (vty, DEBUG_PACKET_DUMP, 1);
1162
1163 return CMD_SUCCESS;
1164}
1165
1166DEFUN (no_debug_isis_packet_dump,
1167 no_debug_isis_packet_dump_cmd,
1168 "no debug isis packet-dump",
1169 UNDEBUG_STR
1170 "IS-IS information\n"
1171 "IS-IS packet dump\n")
1172{
1173 isis->debugs &= ~DEBUG_PACKET_DUMP;
1174 print_debug (vty, DEBUG_PACKET_DUMP, 0);
1175
1176 return CMD_SUCCESS;
1177}
1178
jardineb5d44e2003-12-23 08:09:43 +00001179DEFUN (show_hostname,
1180 show_hostname_cmd,
1181 "show isis hostname",
1182 SHOW_STR
1183 "IS-IS information\n"
1184 "IS-IS Dynamic hostname mapping\n")
1185{
1186 dynhn_print_all (vty);
hassof390d2c2004-09-10 20:48:21 +00001187
jardineb5d44e2003-12-23 08:09:43 +00001188 return CMD_SUCCESS;
1189}
1190
Josh Bailey3f045a02012-03-24 08:35:20 -07001191static void
1192vty_out_timestr(struct vty *vty, time_t uptime)
1193{
1194 struct tm *tm;
1195 time_t difftime = time (NULL);
1196 difftime -= uptime;
1197 tm = gmtime (&difftime);
1198
1199#define ONE_DAY_SECOND 60*60*24
1200#define ONE_WEEK_SECOND 60*60*24*7
1201 if (difftime < ONE_DAY_SECOND)
1202 vty_out (vty, "%02d:%02d:%02d",
1203 tm->tm_hour, tm->tm_min, tm->tm_sec);
1204 else if (difftime < ONE_WEEK_SECOND)
1205 vty_out (vty, "%dd%02dh%02dm",
1206 tm->tm_yday, tm->tm_hour, tm->tm_min);
1207 else
1208 vty_out (vty, "%02dw%dd%02dh",
1209 tm->tm_yday/7,
1210 tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
1211 vty_out (vty, " ago");
1212}
1213
1214DEFUN (show_isis_summary,
1215 show_isis_summary_cmd,
1216 "show isis summary",
1217 SHOW_STR "IS-IS information\n" "IS-IS summary\n")
1218{
1219 struct listnode *node, *node2;
1220 struct isis_area *area;
1221 struct isis_spftree *spftree;
1222 int level;
1223
1224 if (isis == NULL)
1225 {
1226 vty_out (vty, "ISIS is not running%s", VTY_NEWLINE);
1227 return CMD_SUCCESS;
1228 }
1229
1230 vty_out (vty, "Process Id : %ld%s", isis->process_id,
1231 VTY_NEWLINE);
1232 if (isis->sysid_set)
1233 vty_out (vty, "System Id : %s%s", sysid_print (isis->sysid),
1234 VTY_NEWLINE);
1235
1236 vty_out (vty, "Up time : ");
1237 vty_out_timestr(vty, isis->uptime);
1238 vty_out (vty, "%s", VTY_NEWLINE);
1239
1240 if (isis->area_list)
1241 vty_out (vty, "Number of areas : %d%s", isis->area_list->count,
1242 VTY_NEWLINE);
1243
1244 for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
1245 {
1246 vty_out (vty, "Area %s:%s", area->area_tag ? area->area_tag : "null",
1247 VTY_NEWLINE);
1248
1249 if (listcount (area->area_addrs) > 0)
1250 {
1251 struct area_addr *area_addr;
1252 for (ALL_LIST_ELEMENTS_RO (area->area_addrs, node2, area_addr))
1253 {
1254 vty_out (vty, " Net: %s%s",
1255 isonet_print (area_addr->area_addr,
1256 area_addr->addr_len + ISIS_SYS_ID_LEN +
1257 1), VTY_NEWLINE);
1258 }
1259 }
1260
1261 for (level = ISIS_LEVEL1; level <= ISIS_LEVELS; level++)
1262 {
1263 if ((area->is_type & level) == 0)
1264 continue;
1265
1266 vty_out (vty, " Level-%d:%s", level, VTY_NEWLINE);
1267 spftree = area->spftree[level - 1];
1268 if (spftree->pending)
1269 vty_out (vty, " IPv4 SPF: (pending)%s", VTY_NEWLINE);
1270 else
1271 vty_out (vty, " IPv4 SPF:%s", VTY_NEWLINE);
1272
1273 vty_out (vty, " minimum interval : %d%s",
1274 area->min_spf_interval[level - 1], VTY_NEWLINE);
1275
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07001276 vty_out (vty, " last run elapsed : ");
1277 vty_out_timestr(vty, spftree->last_run_timestamp);
Josh Bailey3f045a02012-03-24 08:35:20 -07001278 vty_out (vty, "%s", VTY_NEWLINE);
1279
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07001280 vty_out (vty, " last run duration : %u usec%s",
1281 (u_int32_t)spftree->last_run_duration, VTY_NEWLINE);
1282
Josh Bailey3f045a02012-03-24 08:35:20 -07001283 vty_out (vty, " run count : %d%s",
1284 spftree->runcount, VTY_NEWLINE);
1285
1286#ifdef HAVE_IPV6
1287 spftree = area->spftree6[level - 1];
1288 if (spftree->pending)
1289 vty_out (vty, " IPv6 SPF: (pending)%s", VTY_NEWLINE);
1290 else
1291 vty_out (vty, " IPv6 SPF:%s", VTY_NEWLINE);
1292
1293 vty_out (vty, " minimum interval : %d%s",
1294 area->min_spf_interval[level - 1], VTY_NEWLINE);
1295
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07001296 vty_out (vty, " last run elapsed : ");
1297 vty_out_timestr(vty, spftree->last_run_timestamp);
Josh Bailey3f045a02012-03-24 08:35:20 -07001298 vty_out (vty, "%s", VTY_NEWLINE);
1299
David Lamparteref008d22015-03-03 08:48:11 +01001300 vty_out (vty, " last run duration : %llu msec%s",
1301 (unsigned long long)spftree->last_run_duration, VTY_NEWLINE);
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07001302
Josh Bailey3f045a02012-03-24 08:35:20 -07001303 vty_out (vty, " run count : %d%s",
1304 spftree->runcount, VTY_NEWLINE);
1305#endif
1306 }
1307 }
1308 vty_out (vty, "%s", VTY_NEWLINE);
1309
1310 return CMD_SUCCESS;
1311}
1312
1313/*
1314 * This function supports following display options:
1315 * [ show isis database [detail] ]
1316 * [ show isis database <sysid> [detail] ]
1317 * [ show isis database <hostname> [detail] ]
1318 * [ show isis database <sysid>.<pseudo-id> [detail] ]
1319 * [ show isis database <hostname>.<pseudo-id> [detail] ]
1320 * [ show isis database <sysid>.<pseudo-id>-<fragment-number> [detail] ]
1321 * [ show isis database <hostname>.<pseudo-id>-<fragment-number> [detail] ]
1322 * [ show isis database detail <sysid> ]
1323 * [ show isis database detail <hostname> ]
1324 * [ show isis database detail <sysid>.<pseudo-id> ]
1325 * [ show isis database detail <hostname>.<pseudo-id> ]
1326 * [ show isis database detail <sysid>.<pseudo-id>-<fragment-number> ]
1327 * [ show isis database detail <hostname>.<pseudo-id>-<fragment-number> ]
1328 */
1329static int
1330show_isis_database (struct vty *vty, const char *argv, int ui_level)
jardineb5d44e2003-12-23 08:09:43 +00001331{
hasso3fdb2dd2005-09-28 18:45:54 +00001332 struct listnode *node;
jardineb5d44e2003-12-23 08:09:43 +00001333 struct isis_area *area;
Josh Bailey3f045a02012-03-24 08:35:20 -07001334 struct isis_lsp *lsp;
1335 struct isis_dynhn *dynhn;
1336 const char *pos = argv;
1337 u_char lspid[ISIS_SYS_ID_LEN+2];
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07001338 char sysid[255];
Josh Bailey3f045a02012-03-24 08:35:20 -07001339 u_char number[3];
hassof390d2c2004-09-10 20:48:21 +00001340 int level, lsp_count;
jardineb5d44e2003-12-23 08:09:43 +00001341
1342 if (isis->area_list->count == 0)
1343 return CMD_SUCCESS;
jardineb5d44e2003-12-23 08:09:43 +00001344
Josh Bailey3f045a02012-03-24 08:35:20 -07001345 memset (&lspid, 0, ISIS_SYS_ID_LEN);
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07001346 memset (&sysid, 0, 255);
Josh Bailey3f045a02012-03-24 08:35:20 -07001347
1348 /*
1349 * extract fragment and pseudo id from the string argv
1350 * in the forms:
1351 * (a) <systemid/hostname>.<pseudo-id>-<framenent> or
1352 * (b) <systemid/hostname>.<pseudo-id> or
1353 * (c) <systemid/hostname> or
1354 * Where systemid is in the form:
1355 * xxxx.xxxx.xxxx
1356 */
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07001357 if (argv)
1358 strncpy (sysid, argv, 254);
Josh Bailey3f045a02012-03-24 08:35:20 -07001359 if (argv && strlen (argv) > 3)
1360 {
1361 pos = argv + strlen (argv) - 3;
1362 if (strncmp (pos, "-", 1) == 0)
1363 {
1364 memcpy (number, ++pos, 2);
1365 lspid[ISIS_SYS_ID_LEN+1] = (u_char) strtol ((char *)number, NULL, 16);
1366 pos -= 4;
1367 if (strncmp (pos, ".", 1) != 0)
1368 return CMD_ERR_AMBIGUOUS;
1369 }
1370 if (strncmp (pos, ".", 1) == 0)
1371 {
1372 memcpy (number, ++pos, 2);
1373 lspid[ISIS_SYS_ID_LEN] = (u_char) strtol ((char *)number, NULL, 16);
1374 sysid[pos - argv - 1] = '\0';
1375 }
1376 }
1377
hasso3fdb2dd2005-09-28 18:45:54 +00001378 for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
hassof390d2c2004-09-10 20:48:21 +00001379 {
hassof390d2c2004-09-10 20:48:21 +00001380 vty_out (vty, "Area %s:%s", area->area_tag ? area->area_tag : "null",
Josh Bailey3f045a02012-03-24 08:35:20 -07001381 VTY_NEWLINE);
1382
hassof390d2c2004-09-10 20:48:21 +00001383 for (level = 0; level < ISIS_LEVELS; level++)
Josh Bailey3f045a02012-03-24 08:35:20 -07001384 {
1385 if (area->lspdb[level] && dict_count (area->lspdb[level]) > 0)
1386 {
1387 lsp = NULL;
1388 if (argv != NULL)
1389 {
1390 /*
1391 * Try to find the lsp-id if the argv string is in
1392 * the form hostname.<pseudo-id>-<fragment>
1393 */
1394 if (sysid2buff (lspid, sysid))
1395 {
1396 lsp = lsp_search (lspid, area->lspdb[level]);
1397 }
1398 else if ((dynhn = dynhn_find_by_name (sysid)))
1399 {
1400 memcpy (lspid, dynhn->id, ISIS_SYS_ID_LEN);
1401 lsp = lsp_search (lspid, area->lspdb[level]);
1402 }
1403 else if (strncmp(unix_hostname (), sysid, 15) == 0)
1404 {
1405 memcpy (lspid, isis->sysid, ISIS_SYS_ID_LEN);
1406 lsp = lsp_search (lspid, area->lspdb[level]);
1407 }
1408 }
jardineb5d44e2003-12-23 08:09:43 +00001409
Josh Bailey3f045a02012-03-24 08:35:20 -07001410 if (lsp != NULL || argv == NULL)
1411 {
1412 vty_out (vty, "IS-IS Level-%d link-state database:%s",
1413 level + 1, VTY_NEWLINE);
hassof390d2c2004-09-10 20:48:21 +00001414
Josh Bailey3f045a02012-03-24 08:35:20 -07001415 /* print the title in all cases */
1416 vty_out (vty, "LSP ID PduLen "
1417 "SeqNumber Chksum Holdtime ATT/P/OL%s",
1418 VTY_NEWLINE);
1419 }
1420
1421 if (lsp)
1422 {
1423 if (ui_level == ISIS_UI_LEVEL_DETAIL)
1424 lsp_print_detail (lsp, vty, area->dynhostname);
1425 else
1426 lsp_print (lsp, vty, area->dynhostname);
1427 }
1428 else if (argv == NULL)
1429 {
1430 lsp_count = lsp_print_all (vty, area->lspdb[level],
1431 ui_level,
1432 area->dynhostname);
1433
1434 vty_out (vty, " %u LSPs%s%s",
1435 lsp_count, VTY_NEWLINE, VTY_NEWLINE);
1436 }
1437 }
1438 }
jardineb5d44e2003-12-23 08:09:43 +00001439 }
jardineb5d44e2003-12-23 08:09:43 +00001440
1441 return CMD_SUCCESS;
1442}
1443
Josh Bailey3f045a02012-03-24 08:35:20 -07001444DEFUN (show_database_brief,
1445 show_database_cmd,
1446 "show isis database",
1447 SHOW_STR
1448 "IS-IS information\n"
1449 "IS-IS link state database\n")
1450{
1451 return show_isis_database (vty, NULL, ISIS_UI_LEVEL_BRIEF);
1452}
1453
1454DEFUN (show_database_lsp_brief,
1455 show_database_arg_cmd,
1456 "show isis database WORD",
1457 SHOW_STR
1458 "IS-IS information\n"
1459 "IS-IS link state database\n"
1460 "LSP ID\n")
1461{
1462 return show_isis_database (vty, argv[0], ISIS_UI_LEVEL_BRIEF);
1463}
1464
1465DEFUN (show_database_lsp_detail,
1466 show_database_arg_detail_cmd,
1467 "show isis database WORD detail",
1468 SHOW_STR
1469 "IS-IS information\n"
1470 "IS-IS link state database\n"
1471 "LSP ID\n"
1472 "Detailed information\n")
1473{
1474 return show_isis_database (vty, argv[0], ISIS_UI_LEVEL_DETAIL);
1475}
1476
jardineb5d44e2003-12-23 08:09:43 +00001477DEFUN (show_database_detail,
1478 show_database_detail_cmd,
1479 "show isis database detail",
1480 SHOW_STR
1481 "IS-IS information\n"
1482 "IS-IS link state database\n")
1483{
Josh Bailey3f045a02012-03-24 08:35:20 -07001484 return show_isis_database (vty, NULL, ISIS_UI_LEVEL_DETAIL);
1485}
jardineb5d44e2003-12-23 08:09:43 +00001486
Josh Bailey3f045a02012-03-24 08:35:20 -07001487DEFUN (show_database_detail_lsp,
1488 show_database_detail_arg_cmd,
1489 "show isis database detail WORD",
1490 SHOW_STR
1491 "IS-IS information\n"
1492 "IS-IS link state database\n"
1493 "Detailed information\n"
1494 "LSP ID\n")
1495{
1496 return show_isis_database (vty, argv[0], ISIS_UI_LEVEL_DETAIL);
jardineb5d44e2003-12-23 08:09:43 +00001497}
1498
1499/*
1500 * 'router isis' command
1501 */
1502DEFUN (router_isis,
1503 router_isis_cmd,
1504 "router isis WORD",
hassof390d2c2004-09-10 20:48:21 +00001505 ROUTER_STR
jardineb5d44e2003-12-23 08:09:43 +00001506 "ISO IS-IS\n"
1507 "ISO Routing area tag")
1508{
jardineb5d44e2003-12-23 08:09:43 +00001509 return isis_area_get (vty, argv[0]);
jardineb5d44e2003-12-23 08:09:43 +00001510}
1511
1512/*
1513 *'no router isis' command
1514 */
1515DEFUN (no_router_isis,
1516 no_router_isis_cmd,
1517 "no router isis WORD",
hassof390d2c2004-09-10 20:48:21 +00001518 "no\n" ROUTER_STR "ISO IS-IS\n" "ISO Routing area tag")
jardineb5d44e2003-12-23 08:09:43 +00001519{
1520 return isis_area_destroy (vty, argv[0]);
1521}
1522
1523/*
1524 * 'net' command
1525 */
1526DEFUN (net,
1527 net_cmd,
1528 "net WORD",
1529 "A Network Entity Title for this process (OSI only)\n"
hassof390d2c2004-09-10 20:48:21 +00001530 "XX.XXXX. ... .XXX.XX Network entity title (NET)\n")
jardineb5d44e2003-12-23 08:09:43 +00001531{
Paul Jakma41b36e92006-12-08 01:09:50 +00001532 return area_net_title (vty, argv[0]);
jardineb5d44e2003-12-23 08:09:43 +00001533}
1534
jardineb5d44e2003-12-23 08:09:43 +00001535/*
1536 * 'no net' command
1537 */
1538DEFUN (no_net,
1539 no_net_cmd,
1540 "no net WORD",
1541 NO_STR
1542 "A Network Entity Title for this process (OSI only)\n"
hassof390d2c2004-09-10 20:48:21 +00001543 "XX.XXXX. ... .XXX.XX Network entity title (NET)\n")
jardineb5d44e2003-12-23 08:09:43 +00001544{
Paul Jakma41b36e92006-12-08 01:09:50 +00001545 return area_clear_net_title (vty, argv[0]);
jardineb5d44e2003-12-23 08:09:43 +00001546}
1547
Josh Bailey3f045a02012-03-24 08:35:20 -07001548DEFUN (area_passwd_md5,
1549 area_passwd_md5_cmd,
1550 "area-password md5 WORD",
jardineb5d44e2003-12-23 08:09:43 +00001551 "Configure the authentication password for an area\n"
Josh Bailey3f045a02012-03-24 08:35:20 -07001552 "Authentication type\n"
hassof390d2c2004-09-10 20:48:21 +00001553 "Area password\n")
jardineb5d44e2003-12-23 08:09:43 +00001554{
1555 struct isis_area *area;
1556 int len;
1557
1558 area = vty->index;
1559
hassof390d2c2004-09-10 20:48:21 +00001560 if (!area)
1561 {
Josh Bailey3f045a02012-03-24 08:35:20 -07001562 vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
1563 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00001564 }
1565
jardineb5d44e2003-12-23 08:09:43 +00001566 len = strlen (argv[0]);
hassof390d2c2004-09-10 20:48:21 +00001567 if (len > 254)
1568 {
1569 vty_out (vty, "Too long area password (>254)%s", VTY_NEWLINE);
Josh Bailey3f045a02012-03-24 08:35:20 -07001570 return CMD_ERR_AMBIGUOUS;
hassof390d2c2004-09-10 20:48:21 +00001571 }
Josh Bailey3f045a02012-03-24 08:35:20 -07001572
1573 area->area_passwd.len = (u_char) len;
1574 area->area_passwd.type = ISIS_PASSWD_TYPE_HMAC_MD5;
1575 strncpy ((char *)area->area_passwd.passwd, argv[0], 255);
1576
1577 if (argc > 1)
1578 {
1579 SET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND);
1580 if (strncmp(argv[1], "v", 1) == 0)
1581 SET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV);
1582 else
1583 UNSET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV);
1584 }
1585 else
1586 {
1587 UNSET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND);
1588 UNSET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV);
1589 }
1590 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
1591
1592 return CMD_SUCCESS;
1593}
1594
1595ALIAS (area_passwd_md5,
1596 area_passwd_md5_snpauth_cmd,
1597 "area-password md5 WORD authenticate snp (send-only|validate)",
1598 "Configure the authentication password for an area\n"
1599 "Authentication type\n"
1600 "Area password\n"
1601 "Authentication\n"
1602 "SNP PDUs\n"
1603 "Send but do not check PDUs on receiving\n"
1604 "Send and check PDUs on receiving\n");
1605
1606DEFUN (area_passwd_clear,
1607 area_passwd_clear_cmd,
1608 "area-password clear WORD",
1609 "Configure the authentication password for an area\n"
1610 "Authentication type\n"
1611 "Area password\n")
1612{
1613 struct isis_area *area;
1614 int len;
1615
1616 area = vty->index;
1617
1618 if (!area)
1619 {
1620 vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
1621 return CMD_ERR_NO_MATCH;
1622 }
1623
1624 len = strlen (argv[0]);
1625 if (len > 254)
1626 {
1627 vty_out (vty, "Too long area password (>254)%s", VTY_NEWLINE);
1628 return CMD_ERR_AMBIGUOUS;
1629 }
1630
hassof390d2c2004-09-10 20:48:21 +00001631 area->area_passwd.len = (u_char) len;
jardineb5d44e2003-12-23 08:09:43 +00001632 area->area_passwd.type = ISIS_PASSWD_TYPE_CLEARTXT;
hassof7c43dc2004-09-26 16:24:14 +00001633 strncpy ((char *)area->area_passwd.passwd, argv[0], 255);
hassof390d2c2004-09-10 20:48:21 +00001634
hasso1cbc5622005-01-01 10:29:51 +00001635 if (argc > 1)
1636 {
1637 SET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND);
1638 if (strncmp(argv[1], "v", 1) == 0)
1639 SET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV);
1640 else
1641 UNSET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV);
1642 }
1643 else
1644 {
1645 UNSET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND);
1646 UNSET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV);
1647 }
Josh Bailey3f045a02012-03-24 08:35:20 -07001648 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
hasso1cbc5622005-01-01 10:29:51 +00001649
jardineb5d44e2003-12-23 08:09:43 +00001650 return CMD_SUCCESS;
1651}
1652
Josh Bailey3f045a02012-03-24 08:35:20 -07001653ALIAS (area_passwd_clear,
1654 area_passwd_clear_snpauth_cmd,
1655 "area-password clear WORD authenticate snp (send-only|validate)",
hasso1cbc5622005-01-01 10:29:51 +00001656 "Configure the authentication password for an area\n"
Josh Bailey3f045a02012-03-24 08:35:20 -07001657 "Authentication type\n"
hasso1cbc5622005-01-01 10:29:51 +00001658 "Area password\n"
1659 "Authentication\n"
1660 "SNP PDUs\n"
1661 "Send but do not check PDUs on receiving\n"
1662 "Send and check PDUs on receiving\n");
1663
jardineb5d44e2003-12-23 08:09:43 +00001664DEFUN (no_area_passwd,
1665 no_area_passwd_cmd,
1666 "no area-password",
1667 NO_STR
1668 "Configure the authentication password for an area\n")
1669{
1670 struct isis_area *area;
hassof390d2c2004-09-10 20:48:21 +00001671
jardineb5d44e2003-12-23 08:09:43 +00001672 area = vty->index;
1673
hassof390d2c2004-09-10 20:48:21 +00001674 if (!area)
1675 {
Josh Bailey3f045a02012-03-24 08:35:20 -07001676 vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
1677 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00001678 }
1679
jardineb5d44e2003-12-23 08:09:43 +00001680 memset (&area->area_passwd, 0, sizeof (struct isis_passwd));
Josh Bailey3f045a02012-03-24 08:35:20 -07001681 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
jardineb5d44e2003-12-23 08:09:43 +00001682
1683 return CMD_SUCCESS;
1684}
1685
Josh Bailey3f045a02012-03-24 08:35:20 -07001686DEFUN (domain_passwd_md5,
1687 domain_passwd_md5_cmd,
1688 "domain-password md5 WORD",
jardineb5d44e2003-12-23 08:09:43 +00001689 "Set the authentication password for a routing domain\n"
Josh Bailey3f045a02012-03-24 08:35:20 -07001690 "Authentication type\n"
hassof390d2c2004-09-10 20:48:21 +00001691 "Routing domain password\n")
jardineb5d44e2003-12-23 08:09:43 +00001692{
1693 struct isis_area *area;
1694 int len;
1695
1696 area = vty->index;
1697
hassof390d2c2004-09-10 20:48:21 +00001698 if (!area)
1699 {
Josh Bailey3f045a02012-03-24 08:35:20 -07001700 vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
1701 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00001702 }
1703
jardineb5d44e2003-12-23 08:09:43 +00001704 len = strlen (argv[0]);
hassof390d2c2004-09-10 20:48:21 +00001705 if (len > 254)
1706 {
1707 vty_out (vty, "Too long area password (>254)%s", VTY_NEWLINE);
Josh Bailey3f045a02012-03-24 08:35:20 -07001708 return CMD_ERR_AMBIGUOUS;
hassof390d2c2004-09-10 20:48:21 +00001709 }
Josh Bailey3f045a02012-03-24 08:35:20 -07001710
1711 area->domain_passwd.len = (u_char) len;
1712 area->domain_passwd.type = ISIS_PASSWD_TYPE_HMAC_MD5;
1713 strncpy ((char *)area->domain_passwd.passwd, argv[0], 255);
1714
1715 if (argc > 1)
1716 {
1717 SET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND);
1718 if (strncmp(argv[1], "v", 1) == 0)
1719 SET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV);
1720 else
1721 UNSET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV);
1722 }
1723 else
1724 {
1725 UNSET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND);
1726 UNSET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV);
1727 }
1728 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
1729
1730 return CMD_SUCCESS;
1731}
1732
1733ALIAS (domain_passwd_md5,
1734 domain_passwd_md5_snpauth_cmd,
1735 "domain-password md5 WORD authenticate snp (send-only|validate)",
1736 "Set the authentication password for a routing domain\n"
1737 "Authentication type\n"
1738 "Routing domain password\n"
1739 "Authentication\n"
1740 "SNP PDUs\n"
1741 "Send but do not check PDUs on receiving\n"
1742 "Send and check PDUs on receiving\n");
1743
1744DEFUN (domain_passwd_clear,
1745 domain_passwd_clear_cmd,
1746 "domain-password clear WORD",
1747 "Set the authentication password for a routing domain\n"
1748 "Authentication type\n"
1749 "Routing domain password\n")
1750{
1751 struct isis_area *area;
1752 int len;
1753
1754 area = vty->index;
1755
1756 if (!area)
1757 {
1758 vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
1759 return CMD_ERR_NO_MATCH;
1760 }
1761
1762 len = strlen (argv[0]);
1763 if (len > 254)
1764 {
1765 vty_out (vty, "Too long area password (>254)%s", VTY_NEWLINE);
1766 return CMD_ERR_AMBIGUOUS;
1767 }
1768
hassof390d2c2004-09-10 20:48:21 +00001769 area->domain_passwd.len = (u_char) len;
jardineb5d44e2003-12-23 08:09:43 +00001770 area->domain_passwd.type = ISIS_PASSWD_TYPE_CLEARTXT;
hassof7c43dc2004-09-26 16:24:14 +00001771 strncpy ((char *)area->domain_passwd.passwd, argv[0], 255);
hassof390d2c2004-09-10 20:48:21 +00001772
hasso1cbc5622005-01-01 10:29:51 +00001773 if (argc > 1)
1774 {
1775 SET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND);
1776 if (strncmp(argv[1], "v", 1) == 0)
1777 SET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV);
1778 else
1779 UNSET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV);
1780 }
1781 else
1782 {
1783 UNSET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND);
1784 UNSET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV);
1785 }
Josh Bailey3f045a02012-03-24 08:35:20 -07001786 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
hasso1cbc5622005-01-01 10:29:51 +00001787
jardineb5d44e2003-12-23 08:09:43 +00001788 return CMD_SUCCESS;
1789}
1790
Josh Bailey3f045a02012-03-24 08:35:20 -07001791ALIAS (domain_passwd_clear,
1792 domain_passwd_clear_snpauth_cmd,
1793 "domain-password clear WORD authenticate snp (send-only|validate)",
hasso1cbc5622005-01-01 10:29:51 +00001794 "Set the authentication password for a routing domain\n"
Josh Bailey3f045a02012-03-24 08:35:20 -07001795 "Authentication type\n"
hasso1cbc5622005-01-01 10:29:51 +00001796 "Routing domain password\n"
1797 "Authentication\n"
1798 "SNP PDUs\n"
1799 "Send but do not check PDUs on receiving\n"
1800 "Send and check PDUs on receiving\n");
1801
jardineb5d44e2003-12-23 08:09:43 +00001802DEFUN (no_domain_passwd,
1803 no_domain_passwd_cmd,
Josh Bailey3f045a02012-03-24 08:35:20 -07001804 "no domain-password",
jardineb5d44e2003-12-23 08:09:43 +00001805 NO_STR
1806 "Set the authentication password for a routing domain\n")
1807{
1808 struct isis_area *area;
hassof390d2c2004-09-10 20:48:21 +00001809
jardineb5d44e2003-12-23 08:09:43 +00001810 area = vty->index;
1811
hassof390d2c2004-09-10 20:48:21 +00001812 if (!area)
1813 {
Josh Bailey3f045a02012-03-24 08:35:20 -07001814 vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
1815 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00001816 }
1817
jardineb5d44e2003-12-23 08:09:43 +00001818 memset (&area->domain_passwd, 0, sizeof (struct isis_passwd));
Josh Bailey3f045a02012-03-24 08:35:20 -07001819 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
hassof390d2c2004-09-10 20:48:21 +00001820
jardineb5d44e2003-12-23 08:09:43 +00001821 return CMD_SUCCESS;
1822}
1823
1824DEFUN (is_type,
1825 is_type_cmd,
1826 "is-type (level-1|level-1-2|level-2-only)",
1827 "IS Level for this routing process (OSI only)\n"
1828 "Act as a station router only\n"
1829 "Act as both a station router and an area router\n"
1830 "Act as an area router only\n")
1831{
1832 struct isis_area *area;
1833 int type;
1834
1835 area = vty->index;
1836
hassof390d2c2004-09-10 20:48:21 +00001837 if (!area)
1838 {
Josh Bailey3f045a02012-03-24 08:35:20 -07001839 vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
1840 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00001841 }
jardineb5d44e2003-12-23 08:09:43 +00001842
Paul Jakma41b36e92006-12-08 01:09:50 +00001843 type = string2circuit_t (argv[0]);
hassof390d2c2004-09-10 20:48:21 +00001844 if (!type)
1845 {
1846 vty_out (vty, "Unknown IS level %s", VTY_NEWLINE);
1847 return CMD_SUCCESS;
1848 }
jardineb5d44e2003-12-23 08:09:43 +00001849
1850 isis_event_system_type_change (area, type);
hassof390d2c2004-09-10 20:48:21 +00001851
jardineb5d44e2003-12-23 08:09:43 +00001852 return CMD_SUCCESS;
1853}
1854
1855DEFUN (no_is_type,
1856 no_is_type_cmd,
1857 "no is-type (level-1|level-1-2|level-2-only)",
1858 NO_STR
1859 "IS Level for this routing process (OSI only)\n"
1860 "Act as a station router only\n"
1861 "Act as both a station router and an area router\n"
1862 "Act as an area router only\n")
1863{
jardineb5d44e2003-12-23 08:09:43 +00001864 struct isis_area *area;
1865 int type;
1866
1867 area = vty->index;
1868 assert (area);
hassof390d2c2004-09-10 20:48:21 +00001869
jardineb5d44e2003-12-23 08:09:43 +00001870 /*
Josh Bailey3f045a02012-03-24 08:35:20 -07001871 * Put the is-type back to defaults:
1872 * - level-1-2 on first area
1873 * - level-1 for the rest
jardineb5d44e2003-12-23 08:09:43 +00001874 */
paul1eb8ef22005-04-07 07:30:20 +00001875 if (listgetdata (listhead (isis->area_list)) == area)
jardineb5d44e2003-12-23 08:09:43 +00001876 type = IS_LEVEL_1_AND_2;
1877 else
1878 type = IS_LEVEL_1;
1879
1880 isis_event_system_type_change (area, type);
1881
1882 return CMD_SUCCESS;
1883}
1884
Josh Bailey3f045a02012-03-24 08:35:20 -07001885static int
1886set_lsp_gen_interval (struct vty *vty, struct isis_area *area,
1887 uint16_t interval, int level)
1888{
1889 int lvl;
1890
1891 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl)
1892 {
1893 if (!(lvl & level))
1894 continue;
1895
1896 if (interval >= area->lsp_refresh[lvl-1])
1897 {
1898 vty_out (vty, "LSP gen interval %us must be less than "
1899 "the LSP refresh interval %us%s",
1900 interval, area->lsp_refresh[lvl-1], VTY_NEWLINE);
1901 return CMD_ERR_AMBIGUOUS;
1902 }
1903 }
1904
1905 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl)
1906 {
1907 if (!(lvl & level))
1908 continue;
1909 area->lsp_gen_interval[lvl-1] = interval;
1910 }
1911
1912 return CMD_SUCCESS;
1913}
1914
jardineb5d44e2003-12-23 08:09:43 +00001915DEFUN (lsp_gen_interval,
1916 lsp_gen_interval_cmd,
1917 "lsp-gen-interval <1-120>",
1918 "Minimum interval between regenerating same LSP\n"
1919 "Minimum interval in seconds\n")
1920{
1921 struct isis_area *area;
1922 uint16_t interval;
Josh Bailey3f045a02012-03-24 08:35:20 -07001923 int level;
jardineb5d44e2003-12-23 08:09:43 +00001924
1925 area = vty->index;
jardineb5d44e2003-12-23 08:09:43 +00001926 interval = atoi (argv[0]);
Josh Bailey3f045a02012-03-24 08:35:20 -07001927 level = IS_LEVEL_1 | IS_LEVEL_2;
1928 return set_lsp_gen_interval (vty, area, interval, level);
jardineb5d44e2003-12-23 08:09:43 +00001929}
1930
1931DEFUN (no_lsp_gen_interval,
1932 no_lsp_gen_interval_cmd,
1933 "no lsp-gen-interval",
1934 NO_STR
hassof390d2c2004-09-10 20:48:21 +00001935 "Minimum interval between regenerating same LSP\n")
jardineb5d44e2003-12-23 08:09:43 +00001936{
1937 struct isis_area *area;
Josh Bailey3f045a02012-03-24 08:35:20 -07001938 uint16_t interval;
1939 int level;
jardineb5d44e2003-12-23 08:09:43 +00001940
1941 area = vty->index;
Josh Bailey3f045a02012-03-24 08:35:20 -07001942 interval = DEFAULT_MIN_LSP_GEN_INTERVAL;
1943 level = IS_LEVEL_1 | IS_LEVEL_2;
1944 return set_lsp_gen_interval (vty, area, interval, level);
jardineb5d44e2003-12-23 08:09:43 +00001945}
1946
1947ALIAS (no_lsp_gen_interval,
1948 no_lsp_gen_interval_arg_cmd,
1949 "no lsp-gen-interval <1-120>",
1950 NO_STR
1951 "Minimum interval between regenerating same LSP\n"
hassof390d2c2004-09-10 20:48:21 +00001952 "Minimum interval in seconds\n")
jardineb5d44e2003-12-23 08:09:43 +00001953
1954DEFUN (lsp_gen_interval_l1,
1955 lsp_gen_interval_l1_cmd,
1956 "lsp-gen-interval level-1 <1-120>",
1957 "Minimum interval between regenerating same LSP\n"
1958 "Set interval for level 1 only\n"
hassof390d2c2004-09-10 20:48:21 +00001959 "Minimum interval in seconds\n")
jardineb5d44e2003-12-23 08:09:43 +00001960{
1961 struct isis_area *area;
1962 uint16_t interval;
Josh Bailey3f045a02012-03-24 08:35:20 -07001963 int level;
jardineb5d44e2003-12-23 08:09:43 +00001964
1965 area = vty->index;
jardineb5d44e2003-12-23 08:09:43 +00001966 interval = atoi (argv[0]);
Josh Bailey3f045a02012-03-24 08:35:20 -07001967 level = IS_LEVEL_1;
1968 return set_lsp_gen_interval (vty, area, interval, level);
jardineb5d44e2003-12-23 08:09:43 +00001969}
1970
1971DEFUN (no_lsp_gen_interval_l1,
1972 no_lsp_gen_interval_l1_cmd,
1973 "no lsp-gen-interval level-1",
1974 NO_STR
1975 "Minimum interval between regenerating same LSP\n"
hassof390d2c2004-09-10 20:48:21 +00001976 "Set interval for level 1 only\n")
jardineb5d44e2003-12-23 08:09:43 +00001977{
1978 struct isis_area *area;
Josh Bailey3f045a02012-03-24 08:35:20 -07001979 uint16_t interval;
1980 int level;
jardineb5d44e2003-12-23 08:09:43 +00001981
1982 area = vty->index;
Josh Bailey3f045a02012-03-24 08:35:20 -07001983 interval = DEFAULT_MIN_LSP_GEN_INTERVAL;
1984 level = IS_LEVEL_1;
1985 return set_lsp_gen_interval (vty, area, interval, level);
jardineb5d44e2003-12-23 08:09:43 +00001986}
1987
1988ALIAS (no_lsp_gen_interval_l1,
1989 no_lsp_gen_interval_l1_arg_cmd,
1990 "no lsp-gen-interval level-1 <1-120>",
1991 NO_STR
1992 "Minimum interval between regenerating same LSP\n"
1993 "Set interval for level 1 only\n"
hassof390d2c2004-09-10 20:48:21 +00001994 "Minimum interval in seconds\n")
jardineb5d44e2003-12-23 08:09:43 +00001995
1996DEFUN (lsp_gen_interval_l2,
1997 lsp_gen_interval_l2_cmd,
1998 "lsp-gen-interval level-2 <1-120>",
1999 "Minimum interval between regenerating same LSP\n"
2000 "Set interval for level 2 only\n"
hassof390d2c2004-09-10 20:48:21 +00002001 "Minimum interval in seconds\n")
jardineb5d44e2003-12-23 08:09:43 +00002002{
2003 struct isis_area *area;
Josh Bailey3f045a02012-03-24 08:35:20 -07002004 uint16_t interval;
2005 int level;
jardineb5d44e2003-12-23 08:09:43 +00002006
2007 area = vty->index;
jardineb5d44e2003-12-23 08:09:43 +00002008 interval = atoi (argv[0]);
Josh Bailey3f045a02012-03-24 08:35:20 -07002009 level = IS_LEVEL_2;
2010 return set_lsp_gen_interval (vty, area, interval, level);
jardineb5d44e2003-12-23 08:09:43 +00002011}
2012
2013DEFUN (no_lsp_gen_interval_l2,
2014 no_lsp_gen_interval_l2_cmd,
2015 "no lsp-gen-interval level-2",
2016 NO_STR
2017 "Minimum interval between regenerating same LSP\n"
hassof390d2c2004-09-10 20:48:21 +00002018 "Set interval for level 2 only\n")
jardineb5d44e2003-12-23 08:09:43 +00002019{
2020 struct isis_area *area;
Josh Bailey3f045a02012-03-24 08:35:20 -07002021 uint16_t interval;
2022 int level;
jardineb5d44e2003-12-23 08:09:43 +00002023
2024 area = vty->index;
Josh Bailey3f045a02012-03-24 08:35:20 -07002025 interval = DEFAULT_MIN_LSP_GEN_INTERVAL;
2026 level = IS_LEVEL_2;
2027 return set_lsp_gen_interval (vty, area, interval, level);
jardineb5d44e2003-12-23 08:09:43 +00002028}
2029
2030ALIAS (no_lsp_gen_interval_l2,
2031 no_lsp_gen_interval_l2_arg_cmd,
2032 "no lsp-gen-interval level-2 <1-120>",
2033 NO_STR
2034 "Minimum interval between regenerating same LSP\n"
2035 "Set interval for level 2 only\n"
hassof390d2c2004-09-10 20:48:21 +00002036 "Minimum interval in seconds\n")
jardineb5d44e2003-12-23 08:09:43 +00002037
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002038static int
2039validate_metric_style_narrow (struct vty *vty, struct isis_area *area)
2040{
2041 struct isis_circuit *circuit;
2042 struct listnode *node;
2043
2044 if (! vty)
2045 return CMD_ERR_AMBIGUOUS;
2046
2047 if (! area)
2048 {
2049 vty_out (vty, "ISIS area is invalid%s", VTY_NEWLINE);
2050 return CMD_ERR_AMBIGUOUS;
2051 }
2052
2053 for (ALL_LIST_ELEMENTS_RO (area->circuit_list, node, circuit))
2054 {
2055 if ((area->is_type & IS_LEVEL_1) &&
2056 (circuit->is_type & IS_LEVEL_1) &&
Christian Franke4fb7c842012-11-27 19:51:59 +00002057 (circuit->te_metric[0] > MAX_NARROW_LINK_METRIC))
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002058 {
2059 vty_out (vty, "ISIS circuit %s metric is invalid%s",
2060 circuit->interface->name, VTY_NEWLINE);
2061 return CMD_ERR_AMBIGUOUS;
2062 }
2063 if ((area->is_type & IS_LEVEL_2) &&
2064 (circuit->is_type & IS_LEVEL_2) &&
Christian Franke4fb7c842012-11-27 19:51:59 +00002065 (circuit->te_metric[1] > MAX_NARROW_LINK_METRIC))
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002066 {
2067 vty_out (vty, "ISIS circuit %s metric is invalid%s",
2068 circuit->interface->name, VTY_NEWLINE);
2069 return CMD_ERR_AMBIGUOUS;
2070 }
2071 }
2072
2073 return CMD_SUCCESS;
2074}
2075
jardineb5d44e2003-12-23 08:09:43 +00002076DEFUN (metric_style,
2077 metric_style_cmd,
hasso2984d262005-09-26 16:49:07 +00002078 "metric-style (narrow|transition|wide)",
jardineb5d44e2003-12-23 08:09:43 +00002079 "Use old-style (ISO 10589) or new-style packet formats\n"
2080 "Use old style of TLVs with narrow metric\n"
hasso2984d262005-09-26 16:49:07 +00002081 "Send and accept both styles of TLVs during transition\n"
jardineb5d44e2003-12-23 08:09:43 +00002082 "Use new style of TLVs to carry wider metric\n")
2083{
2084 struct isis_area *area;
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002085 int ret;
jardineb5d44e2003-12-23 08:09:43 +00002086
2087 area = vty->index;
2088 assert (area);
hasso2984d262005-09-26 16:49:07 +00002089
2090 if (strncmp (argv[0], "w", 1) == 0)
2091 {
2092 area->newmetric = 1;
2093 area->oldmetric = 0;
2094 }
Christian Franke478c1122012-11-27 19:52:00 +00002095 else
hasso2984d262005-09-26 16:49:07 +00002096 {
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002097 ret = validate_metric_style_narrow (vty, area);
2098 if (ret != CMD_SUCCESS)
2099 return ret;
2100
Christian Franke478c1122012-11-27 19:52:00 +00002101 if (strncmp (argv[0], "t", 1) == 0)
2102 {
2103 area->newmetric = 1;
2104 area->oldmetric = 1;
2105 }
2106 else if (strncmp (argv[0], "n", 1) == 0)
2107 {
2108 area->newmetric = 0;
2109 area->oldmetric = 1;
2110 }
hasso2984d262005-09-26 16:49:07 +00002111 }
jardineb5d44e2003-12-23 08:09:43 +00002112
2113 return CMD_SUCCESS;
2114}
2115
2116DEFUN (no_metric_style,
2117 no_metric_style_cmd,
hasso2984d262005-09-26 16:49:07 +00002118 "no metric-style",
jardineb5d44e2003-12-23 08:09:43 +00002119 NO_STR
hasso2984d262005-09-26 16:49:07 +00002120 "Use old-style (ISO 10589) or new-style packet formats\n")
jardineb5d44e2003-12-23 08:09:43 +00002121{
2122 struct isis_area *area;
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002123 int ret;
jardineb5d44e2003-12-23 08:09:43 +00002124
2125 area = vty->index;
2126 assert (area);
2127
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002128 ret = validate_metric_style_narrow (vty, area);
2129 if (ret != CMD_SUCCESS)
2130 return ret;
2131
hasso2984d262005-09-26 16:49:07 +00002132 /* Default is narrow metric. */
2133 area->newmetric = 0;
2134 area->oldmetric = 1;
jardineb5d44e2003-12-23 08:09:43 +00002135
2136 return CMD_SUCCESS;
2137}
2138
Josh Bailey3f045a02012-03-24 08:35:20 -07002139DEFUN (set_overload_bit,
2140 set_overload_bit_cmd,
2141 "set-overload-bit",
2142 "Set overload bit to avoid any transit traffic\n"
2143 "Set overload bit\n")
2144{
2145 struct isis_area *area;
2146
2147 area = vty->index;
2148 assert (area);
2149
2150 area->overload_bit = LSPBIT_OL;
2151 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
2152
2153 return CMD_SUCCESS;
2154}
2155
2156DEFUN (no_set_overload_bit,
2157 no_set_overload_bit_cmd,
2158 "no set-overload-bit",
2159 "Reset overload bit to accept transit traffic\n"
2160 "Reset overload bit\n")
2161{
2162 struct isis_area *area;
2163
2164 area = vty->index;
2165 assert (area);
2166
2167 area->overload_bit = 0;
2168 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
2169
2170 return CMD_SUCCESS;
2171}
2172
jardineb5d44e2003-12-23 08:09:43 +00002173DEFUN (dynamic_hostname,
2174 dynamic_hostname_cmd,
2175 "hostname dynamic",
2176 "Dynamic hostname for IS-IS\n"
hassof390d2c2004-09-10 20:48:21 +00002177 "Dynamic hostname\n")
jardineb5d44e2003-12-23 08:09:43 +00002178{
2179 struct isis_area *area;
2180
2181 area = vty->index;
2182 assert (area);
hassof390d2c2004-09-10 20:48:21 +00002183
Josh Bailey3f045a02012-03-24 08:35:20 -07002184 if (!area->dynhostname)
2185 {
2186 area->dynhostname = 1;
2187 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 0);
2188 }
hassof390d2c2004-09-10 20:48:21 +00002189
jardineb5d44e2003-12-23 08:09:43 +00002190 return CMD_SUCCESS;
2191}
2192
2193DEFUN (no_dynamic_hostname,
2194 no_dynamic_hostname_cmd,
2195 "no hostname dynamic",
2196 NO_STR
2197 "Dynamic hostname for IS-IS\n"
hassof390d2c2004-09-10 20:48:21 +00002198 "Dynamic hostname\n")
jardineb5d44e2003-12-23 08:09:43 +00002199{
2200 struct isis_area *area;
2201
2202 area = vty->index;
2203 assert (area);
hassof390d2c2004-09-10 20:48:21 +00002204
Josh Bailey3f045a02012-03-24 08:35:20 -07002205 if (area->dynhostname)
2206 {
2207 area->dynhostname = 0;
2208 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 0);
2209 }
hassof390d2c2004-09-10 20:48:21 +00002210
jardineb5d44e2003-12-23 08:09:43 +00002211 return CMD_SUCCESS;
2212}
2213
2214DEFUN (spf_interval,
2215 spf_interval_cmd,
2216 "spf-interval <1-120>",
hasso2097cd82003-12-23 11:51:08 +00002217 "Minimum interval between SPF calculations\n"
jardineb5d44e2003-12-23 08:09:43 +00002218 "Minimum interval between consecutive SPFs in seconds\n")
2219{
2220 struct isis_area *area;
2221 u_int16_t interval;
hassof390d2c2004-09-10 20:48:21 +00002222
jardineb5d44e2003-12-23 08:09:43 +00002223 area = vty->index;
2224 interval = atoi (argv[0]);
2225 area->min_spf_interval[0] = interval;
2226 area->min_spf_interval[1] = interval;
hassof390d2c2004-09-10 20:48:21 +00002227
jardineb5d44e2003-12-23 08:09:43 +00002228 return CMD_SUCCESS;
2229}
2230
2231DEFUN (no_spf_interval,
2232 no_spf_interval_cmd,
2233 "no spf-interval",
2234 NO_STR
hassof390d2c2004-09-10 20:48:21 +00002235 "Minimum interval between SPF calculations\n")
jardineb5d44e2003-12-23 08:09:43 +00002236{
2237 struct isis_area *area;
hassof390d2c2004-09-10 20:48:21 +00002238
jardineb5d44e2003-12-23 08:09:43 +00002239 area = vty->index;
2240
2241 area->min_spf_interval[0] = MINIMUM_SPF_INTERVAL;
2242 area->min_spf_interval[1] = MINIMUM_SPF_INTERVAL;
hassof390d2c2004-09-10 20:48:21 +00002243
jardineb5d44e2003-12-23 08:09:43 +00002244 return CMD_SUCCESS;
2245}
2246
2247ALIAS (no_spf_interval,
2248 no_spf_interval_arg_cmd,
2249 "no spf-interval <1-120>",
2250 NO_STR
2251 "Minimum interval between SPF calculations\n"
hassof390d2c2004-09-10 20:48:21 +00002252 "Minimum interval between consecutive SPFs in seconds\n")
jardineb5d44e2003-12-23 08:09:43 +00002253
2254DEFUN (spf_interval_l1,
2255 spf_interval_l1_cmd,
2256 "spf-interval level-1 <1-120>",
2257 "Minimum interval between SPF calculations\n"
2258 "Set interval for level 1 only\n"
2259 "Minimum interval between consecutive SPFs in seconds\n")
2260{
2261 struct isis_area *area;
2262 u_int16_t interval;
hassof390d2c2004-09-10 20:48:21 +00002263
jardineb5d44e2003-12-23 08:09:43 +00002264 area = vty->index;
2265 interval = atoi (argv[0]);
2266 area->min_spf_interval[0] = interval;
hassof390d2c2004-09-10 20:48:21 +00002267
jardineb5d44e2003-12-23 08:09:43 +00002268 return CMD_SUCCESS;
2269}
2270
2271DEFUN (no_spf_interval_l1,
2272 no_spf_interval_l1_cmd,
2273 "no spf-interval level-1",
2274 NO_STR
2275 "Minimum interval between SPF calculations\n"
2276 "Set interval for level 1 only\n")
2277{
2278 struct isis_area *area;
hassof390d2c2004-09-10 20:48:21 +00002279
jardineb5d44e2003-12-23 08:09:43 +00002280 area = vty->index;
2281
2282 area->min_spf_interval[0] = MINIMUM_SPF_INTERVAL;
hassof390d2c2004-09-10 20:48:21 +00002283
jardineb5d44e2003-12-23 08:09:43 +00002284 return CMD_SUCCESS;
2285}
2286
2287ALIAS (no_spf_interval,
2288 no_spf_interval_l1_arg_cmd,
2289 "no spf-interval level-1 <1-120>",
2290 NO_STR
2291 "Minimum interval between SPF calculations\n"
2292 "Set interval for level 1 only\n"
2293 "Minimum interval between consecutive SPFs in seconds\n")
2294
2295DEFUN (spf_interval_l2,
2296 spf_interval_l2_cmd,
2297 "spf-interval level-2 <1-120>",
2298 "Minimum interval between SPF calculations\n"
2299 "Set interval for level 2 only\n"
2300 "Minimum interval between consecutive SPFs in seconds\n")
2301{
2302 struct isis_area *area;
2303 u_int16_t interval;
hassof390d2c2004-09-10 20:48:21 +00002304
jardineb5d44e2003-12-23 08:09:43 +00002305 area = vty->index;
2306 interval = atoi (argv[0]);
2307 area->min_spf_interval[1] = interval;
hassof390d2c2004-09-10 20:48:21 +00002308
jardineb5d44e2003-12-23 08:09:43 +00002309 return CMD_SUCCESS;
2310}
2311
2312DEFUN (no_spf_interval_l2,
2313 no_spf_interval_l2_cmd,
2314 "no spf-interval level-2",
2315 NO_STR
2316 "Minimum interval between SPF calculations\n"
2317 "Set interval for level 2 only\n")
2318{
2319 struct isis_area *area;
hassof390d2c2004-09-10 20:48:21 +00002320
jardineb5d44e2003-12-23 08:09:43 +00002321 area = vty->index;
2322
2323 area->min_spf_interval[1] = MINIMUM_SPF_INTERVAL;
hassof390d2c2004-09-10 20:48:21 +00002324
jardineb5d44e2003-12-23 08:09:43 +00002325 return CMD_SUCCESS;
2326}
2327
2328ALIAS (no_spf_interval,
2329 no_spf_interval_l2_arg_cmd,
2330 "no spf-interval level-2 <1-120>",
2331 NO_STR
2332 "Minimum interval between SPF calculations\n"
2333 "Set interval for level 2 only\n"
2334 "Minimum interval between consecutive SPFs in seconds\n")
2335
Josh Bailey3f045a02012-03-24 08:35:20 -07002336static int
2337set_lsp_max_lifetime (struct vty *vty, struct isis_area *area,
2338 uint16_t interval, int level)
2339{
2340 int lvl;
2341 int set_refresh_interval[ISIS_LEVELS] = {0, 0};
2342 uint16_t refresh_interval;
2343
2344 refresh_interval = interval - 300;
2345
2346 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; lvl++)
2347 {
2348 if (!(lvl & level))
2349 continue;
2350 if (refresh_interval < area->lsp_refresh[lvl-1])
2351 {
2352 vty_out (vty, "Level %d Max LSP lifetime %us must be 300s greater than "
2353 "the configured LSP refresh interval %us%s",
2354 lvl, interval, area->lsp_refresh[lvl-1], VTY_NEWLINE);
2355 vty_out (vty, "Automatically reducing level %d LSP refresh interval "
2356 "to %us%s", lvl, refresh_interval, VTY_NEWLINE);
2357 set_refresh_interval[lvl-1] = 1;
2358
2359 if (refresh_interval <= area->lsp_gen_interval[lvl-1])
2360 {
2361 vty_out (vty, "LSP refresh interval %us must be greater than "
2362 "the configured LSP gen interval %us%s",
2363 refresh_interval, area->lsp_gen_interval[lvl-1],
2364 VTY_NEWLINE);
2365 return CMD_ERR_AMBIGUOUS;
2366 }
2367 }
2368 }
2369
2370 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; lvl++)
2371 {
2372 if (!(lvl & level))
2373 continue;
2374 area->max_lsp_lifetime[lvl-1] = interval;
2375 /* Automatically reducing lsp_refresh_interval to interval - 300 */
2376 if (set_refresh_interval[lvl-1])
2377 area->lsp_refresh[lvl-1] = refresh_interval;
2378 }
2379
2380 lsp_regenerate_schedule (area, level, 1);
2381
2382 return CMD_SUCCESS;
2383}
2384
2385DEFUN (max_lsp_lifetime,
2386 max_lsp_lifetime_cmd,
2387 "max-lsp-lifetime <350-65535>",
2388 "Maximum LSP lifetime\n"
2389 "LSP lifetime in seconds\n")
2390{
2391 struct isis_area *area;
2392 uint16_t interval;
2393 int level;
2394
2395 area = vty->index;
2396 interval = atoi (argv[0]);
2397 level = IS_LEVEL_1 | IS_LEVEL_2;
2398 return set_lsp_max_lifetime (vty, area, interval, level);
2399}
2400
2401DEFUN (no_max_lsp_lifetime,
2402 no_max_lsp_lifetime_cmd,
2403 "no max-lsp-lifetime",
2404 NO_STR
2405 "LSP lifetime in seconds\n")
2406{
2407 struct isis_area *area;
2408 uint16_t interval;
2409 int level;
2410
2411 area = vty->index;
2412 interval = DEFAULT_LSP_LIFETIME;
2413 level = IS_LEVEL_1 | IS_LEVEL_2;
2414 return set_lsp_max_lifetime (vty, area, interval, level);
2415}
2416
2417ALIAS (no_max_lsp_lifetime,
2418 no_max_lsp_lifetime_arg_cmd,
2419 "no max-lsp-lifetime <350-65535>",
2420 NO_STR
2421 "Maximum LSP lifetime\n"
2422 "LSP lifetime in seconds\n")
2423
2424DEFUN (max_lsp_lifetime_l1,
2425 max_lsp_lifetime_l1_cmd,
2426 "max-lsp-lifetime level-1 <350-65535>",
2427 "Maximum LSP lifetime for Level 1 only\n"
2428 "LSP lifetime for Level 1 only in seconds\n")
2429{
2430 struct isis_area *area;
2431 uint16_t interval;
2432 int level;
2433
2434 area = vty->index;
2435 interval = atoi (argv[0]);
2436 level = IS_LEVEL_1;
2437 return set_lsp_max_lifetime (vty, area, interval, level);
2438}
2439
2440DEFUN (no_max_lsp_lifetime_l1,
2441 no_max_lsp_lifetime_l1_cmd,
2442 "no max-lsp-lifetime level-1",
2443 NO_STR
2444 "LSP lifetime for Level 1 only in seconds\n")
2445{
2446 struct isis_area *area;
2447 uint16_t interval;
2448 int level;
2449
2450 area = vty->index;
2451 interval = DEFAULT_LSP_LIFETIME;
2452 level = IS_LEVEL_1;
2453 return set_lsp_max_lifetime (vty, area, interval, level);
2454}
2455
2456ALIAS (no_max_lsp_lifetime_l1,
2457 no_max_lsp_lifetime_l1_arg_cmd,
2458 "no max-lsp-lifetime level-1 <350-65535>",
2459 NO_STR
2460 "Maximum LSP lifetime for Level 1 only\n"
2461 "LSP lifetime for Level 1 only in seconds\n")
2462
2463DEFUN (max_lsp_lifetime_l2,
2464 max_lsp_lifetime_l2_cmd,
2465 "max-lsp-lifetime level-2 <350-65535>",
2466 "Maximum LSP lifetime for Level 2 only\n"
2467 "LSP lifetime for Level 2 only in seconds\n")
2468{
2469 struct isis_area *area;
2470 uint16_t interval;
2471 int level;
2472
2473 area = vty->index;
2474 interval = atoi (argv[0]);
2475 level = IS_LEVEL_2;
2476 return set_lsp_max_lifetime (vty, area, interval, level);
2477}
2478
2479DEFUN (no_max_lsp_lifetime_l2,
2480 no_max_lsp_lifetime_l2_cmd,
2481 "no max-lsp-lifetime level-2",
2482 NO_STR
2483 "LSP lifetime for Level 2 only in seconds\n")
2484{
2485 struct isis_area *area;
2486 uint16_t interval;
2487 int level;
2488
2489 area = vty->index;
2490 interval = DEFAULT_LSP_LIFETIME;
2491 level = IS_LEVEL_2;
2492 return set_lsp_max_lifetime (vty, area, interval, level);
2493}
2494
2495ALIAS (no_max_lsp_lifetime_l2,
2496 no_max_lsp_lifetime_l2_arg_cmd,
2497 "no max-lsp-lifetime level-2 <350-65535>",
2498 NO_STR
2499 "Maximum LSP lifetime for Level 2 only\n"
2500 "LSP lifetime for Level 2 only in seconds\n")
2501
2502static int
2503set_lsp_refresh_interval (struct vty *vty, struct isis_area *area,
2504 uint16_t interval, int level)
2505{
2506 int lvl;
2507
2508 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl)
2509 {
2510 if (!(lvl & level))
2511 continue;
2512 if (interval <= area->lsp_gen_interval[lvl-1])
2513 {
2514 vty_out (vty, "LSP refresh interval %us must be greater than "
2515 "the configured LSP gen interval %us%s",
2516 interval, area->lsp_gen_interval[lvl-1],
2517 VTY_NEWLINE);
2518 return CMD_ERR_AMBIGUOUS;
2519 }
2520 if (interval > (area->max_lsp_lifetime[lvl-1] - 300))
2521 {
2522 vty_out (vty, "LSP refresh interval %us must be less than "
2523 "the configured LSP lifetime %us less 300%s",
2524 interval, area->max_lsp_lifetime[lvl-1],
2525 VTY_NEWLINE);
2526 return CMD_ERR_AMBIGUOUS;
2527 }
2528 }
2529
2530 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl)
2531 {
2532 if (!(lvl & level))
2533 continue;
2534 area->lsp_refresh[lvl-1] = interval;
2535 }
2536 lsp_regenerate_schedule (area, level, 1);
2537
2538 return CMD_SUCCESS;
2539}
2540
2541DEFUN (lsp_refresh_interval,
2542 lsp_refresh_interval_cmd,
2543 "lsp-refresh-interval <1-65235>",
2544 "LSP refresh interval\n"
2545 "LSP refresh interval in seconds\n")
2546{
2547 struct isis_area *area;
2548 uint16_t interval;
2549 int level;
2550
2551 area = vty->index;
2552 interval = atoi (argv[0]);
2553 level = IS_LEVEL_1 | IS_LEVEL_2;
2554 return set_lsp_refresh_interval (vty, area, interval, level);
2555}
2556
2557DEFUN (no_lsp_refresh_interval,
2558 no_lsp_refresh_interval_cmd,
2559 "no lsp-refresh-interval",
2560 NO_STR
2561 "LSP refresh interval in seconds\n")
2562{
2563 struct isis_area *area;
2564 uint16_t interval;
2565 int level;
2566
2567 area = vty->index;
2568 interval = DEFAULT_MAX_LSP_GEN_INTERVAL;
2569 level = IS_LEVEL_1 | IS_LEVEL_2;
2570 return set_lsp_refresh_interval (vty, area, interval, level);
2571}
2572
2573ALIAS (no_lsp_refresh_interval,
2574 no_lsp_refresh_interval_arg_cmd,
2575 "no lsp-refresh-interval <1-65235>",
2576 NO_STR
2577 "LSP refresh interval\n"
2578 "LSP refresh interval in seconds\n")
2579
2580DEFUN (lsp_refresh_interval_l1,
2581 lsp_refresh_interval_l1_cmd,
2582 "lsp-refresh-interval level-1 <1-65235>",
2583 "LSP refresh interval for Level 1 only\n"
2584 "LSP refresh interval for Level 1 only in seconds\n")
2585{
2586 struct isis_area *area;
2587 uint16_t interval;
2588 int level;
2589
2590 area = vty->index;
2591 interval = atoi (argv[0]);
2592 level = IS_LEVEL_1;
2593 return set_lsp_refresh_interval (vty, area, interval, level);
2594}
2595
2596DEFUN (no_lsp_refresh_interval_l1,
2597 no_lsp_refresh_interval_l1_cmd,
2598 "no lsp-refresh-interval level-1",
2599 NO_STR
2600 "LSP refresh interval for Level 1 only in seconds\n")
2601{
2602 struct isis_area *area;
2603 uint16_t interval;
2604 int level;
2605
2606 area = vty->index;
2607 interval = DEFAULT_MAX_LSP_GEN_INTERVAL;
2608 level = IS_LEVEL_1;
2609 return set_lsp_refresh_interval (vty, area, interval, level);
2610}
2611
2612ALIAS (no_lsp_refresh_interval_l1,
2613 no_lsp_refresh_interval_l1_arg_cmd,
2614 "no lsp-refresh-interval level-1 <1-65235>",
2615 NO_STR
2616 "LSP refresh interval for Level 1 only\n"
2617 "LSP refresh interval for Level 1 only in seconds\n")
2618
2619DEFUN (lsp_refresh_interval_l2,
2620 lsp_refresh_interval_l2_cmd,
2621 "lsp-refresh-interval level-2 <1-65235>",
2622 "LSP refresh interval for Level 2 only\n"
2623 "LSP refresh interval for Level 2 only in seconds\n")
2624{
2625 struct isis_area *area;
2626 uint16_t interval;
2627 int level;
2628
2629 area = vty->index;
2630 interval = atoi (argv[0]);
2631 level = IS_LEVEL_2;
2632 return set_lsp_refresh_interval (vty, area, interval, level);
2633}
2634
2635DEFUN (no_lsp_refresh_interval_l2,
2636 no_lsp_refresh_interval_l2_cmd,
2637 "no lsp-refresh-interval level-2",
2638 NO_STR
2639 "LSP refresh interval for Level 2 only in seconds\n")
2640{
2641 struct isis_area *area;
2642 uint16_t interval;
2643 int level;
2644
2645 area = vty->index;
2646 interval = DEFAULT_MAX_LSP_GEN_INTERVAL;
2647 level = IS_LEVEL_2;
2648 return set_lsp_refresh_interval (vty, area, interval, level);
2649}
2650
2651ALIAS (no_lsp_refresh_interval_l2,
2652 no_lsp_refresh_interval_l2_arg_cmd,
2653 "no lsp-refresh-interval level-2 <1-65235>",
2654 NO_STR
2655 "LSP refresh interval for Level 2 only\n"
2656 "LSP refresh interval for Level 2 only in seconds\n")
2657
2658DEFUN (log_adj_changes,
2659 log_adj_changes_cmd,
2660 "log-adjacency-changes",
2661 "Log changes in adjacency state\n")
2662{
2663 struct isis_area *area;
2664
2665 area = vty->index;
2666 assert (area);
2667
2668 area->log_adj_changes = 1;
2669
2670 return CMD_SUCCESS;
2671}
2672
2673DEFUN (no_log_adj_changes,
2674 no_log_adj_changes_cmd,
2675 "no log-adjacency-changes",
2676 "Stop logging changes in adjacency state\n")
2677{
2678 struct isis_area *area;
2679
2680 area = vty->index;
2681 assert (area);
2682
2683 area->log_adj_changes = 0;
2684
2685 return CMD_SUCCESS;
2686}
2687
jardineb5d44e2003-12-23 08:09:43 +00002688#ifdef TOPOLOGY_GENERATE
Josh Bailey3f045a02012-03-24 08:35:20 -07002689
jardineb5d44e2003-12-23 08:09:43 +00002690DEFUN (topology_generate_grid,
2691 topology_generate_grid_cmd,
2692 "topology generate grid <1-100> <1-100> <1-65000> [param] [param] "
2693 "[param]",
hassof1082d12005-09-19 04:23:34 +00002694 "Topology generation for IS-IS\n"
2695 "Topology generation\n"
2696 "Grid topology\n"
jardineb5d44e2003-12-23 08:09:43 +00002697 "X parameter of the grid\n"
2698 "Y parameter of the grid\n"
2699 "Random seed\n"
2700 "Optional param 1\n"
2701 "Optional param 2\n"
2702 "Optional param 3\n"
2703 "Topology\n")
2704{
2705 struct isis_area *area;
2706
2707 area = vty->index;
2708 assert (area);
2709
hassof390d2c2004-09-10 20:48:21 +00002710 if (!spgrid_check_params (vty, argc, argv))
2711 {
2712 if (area->topology)
2713 list_delete (area->topology);
2714 area->topology = list_new ();
2715 memcpy (area->top_params, vty->buf, 200);
2716 gen_spgrid_topology (vty, area->topology);
2717 remove_topology_lsps (area);
2718 generate_topology_lsps (area);
hassof1082d12005-09-19 04:23:34 +00002719 /* Regenerate L1 LSP to get two way connection to the generated
2720 * topology. */
Josh Bailey3f045a02012-03-24 08:35:20 -07002721 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
hassof390d2c2004-09-10 20:48:21 +00002722 }
jardineb5d44e2003-12-23 08:09:43 +00002723
2724 return CMD_SUCCESS;
2725}
2726
hassof695b012005-04-02 19:03:39 +00002727DEFUN (show_isis_generated_topology,
2728 show_isis_generated_topology_cmd,
hassof1082d12005-09-19 04:23:34 +00002729 "show isis generated-topologies",
jardineb5d44e2003-12-23 08:09:43 +00002730 SHOW_STR
Josh Bailey3f045a02012-03-24 08:35:20 -07002731 "ISIS network information\n"
hassof1082d12005-09-19 04:23:34 +00002732 "Show generated topologies\n")
jardineb5d44e2003-12-23 08:09:43 +00002733{
2734 struct isis_area *area;
paul92c9f222005-05-25 12:21:13 +00002735 struct listnode *node;
jardineb5d44e2003-12-23 08:09:43 +00002736 struct listnode *node2;
2737 struct arc *arc;
hassof1082d12005-09-19 04:23:34 +00002738
paul92c9f222005-05-25 12:21:13 +00002739 for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
hassof1082d12005-09-19 04:23:34 +00002740 {
2741 if (!area->topology)
2742 continue;
2743
2744 vty_out (vty, "Topology for isis area: %s%s", area->area_tag,
2745 VTY_NEWLINE);
2746 vty_out (vty, "From node To node Distance%s", VTY_NEWLINE);
2747
2748 for (ALL_LIST_ELEMENTS_RO (area->topology, node2, arc))
2749 vty_out (vty, "%9ld %11ld %12ld%s", arc->from_node, arc->to_node,
2750 arc->distance, VTY_NEWLINE);
2751 }
jardineb5d44e2003-12-23 08:09:43 +00002752 return CMD_SUCCESS;
2753}
2754
hassof1082d12005-09-19 04:23:34 +00002755/* Base IS for topology generation. */
hassof390d2c2004-09-10 20:48:21 +00002756DEFUN (topology_baseis,
jardineb5d44e2003-12-23 08:09:43 +00002757 topology_baseis_cmd,
2758 "topology base-is WORD",
hassof1082d12005-09-19 04:23:34 +00002759 "Topology generation for IS-IS\n"
2760 "A Network IS Base for this topology\n"
2761 "XXXX.XXXX.XXXX Network entity title (NET)\n")
jardineb5d44e2003-12-23 08:09:43 +00002762{
2763 struct isis_area *area;
2764 u_char buff[ISIS_SYS_ID_LEN];
2765
2766 area = vty->index;
2767 assert (area);
2768
hassof390d2c2004-09-10 20:48:21 +00002769 if (sysid2buff (buff, argv[0]))
hassof1082d12005-09-19 04:23:34 +00002770 sysid2buff (area->topology_baseis, argv[0]);
hassof390d2c2004-09-10 20:48:21 +00002771
jardineb5d44e2003-12-23 08:09:43 +00002772 return CMD_SUCCESS;
2773}
2774
jardineb5d44e2003-12-23 08:09:43 +00002775DEFUN (no_topology_baseis,
2776 no_topology_baseis_cmd,
2777 "no topology base-is WORD",
2778 NO_STR
hassof1082d12005-09-19 04:23:34 +00002779 "Topology generation for IS-IS\n"
2780 "A Network IS Base for this topology\n"
2781 "XXXX.XXXX.XXXX Network entity title (NET)\n")
jardineb5d44e2003-12-23 08:09:43 +00002782{
2783 struct isis_area *area;
2784
2785 area = vty->index;
2786 assert (area);
2787
hassof390d2c2004-09-10 20:48:21 +00002788 memcpy (area->topology_baseis, DEFAULT_TOPOLOGY_BASEIS, ISIS_SYS_ID_LEN);
jardineb5d44e2003-12-23 08:09:43 +00002789 return CMD_SUCCESS;
2790}
2791
hassof1082d12005-09-19 04:23:34 +00002792ALIAS (no_topology_baseis,
2793 no_topology_baseis_noid_cmd,
2794 "no topology base-is",
2795 NO_STR
2796 "Topology generation for IS-IS\n"
2797 "A Network IS Base for this topology\n")
2798
2799DEFUN (topology_basedynh,
2800 topology_basedynh_cmd,
2801 "topology base-dynh WORD",
2802 "Topology generation for IS-IS\n"
2803 "Dynamic hostname base for this topology\n"
2804 "Dynamic hostname base\n")
2805{
2806 struct isis_area *area;
2807
2808 area = vty->index;
2809 assert (area);
2810
2811 /* I hope that it's enough. */
2812 area->topology_basedynh = strndup (argv[0], 16);
2813 return CMD_SUCCESS;
2814}
Josh Bailey3f045a02012-03-24 08:35:20 -07002815
jardineb5d44e2003-12-23 08:09:43 +00002816#endif /* TOPOLOGY_GENERATE */
2817
jardineb5d44e2003-12-23 08:09:43 +00002818/* IS-IS configuration write function */
2819int
2820isis_config_write (struct vty *vty)
2821{
2822 int write = 0;
jardineb5d44e2003-12-23 08:09:43 +00002823
hassof390d2c2004-09-10 20:48:21 +00002824 if (isis != NULL)
2825 {
2826 struct isis_area *area;
hasso3fdb2dd2005-09-28 18:45:54 +00002827 struct listnode *node, *node2;
jardineb5d44e2003-12-23 08:09:43 +00002828
hasso3fdb2dd2005-09-28 18:45:54 +00002829 for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
hassof390d2c2004-09-10 20:48:21 +00002830 {
2831 /* ISIS - Area name */
2832 vty_out (vty, "router isis %s%s", area->area_tag, VTY_NEWLINE);
2833 write++;
2834 /* ISIS - Net */
2835 if (listcount (area->area_addrs) > 0)
2836 {
2837 struct area_addr *area_addr;
hasso3fdb2dd2005-09-28 18:45:54 +00002838 for (ALL_LIST_ELEMENTS_RO (area->area_addrs, node2, area_addr))
2839 {
2840 vty_out (vty, " net %s%s",
2841 isonet_print (area_addr->area_addr,
2842 area_addr->addr_len + ISIS_SYS_ID_LEN +
2843 1), VTY_NEWLINE);
2844 write++;
2845 }
hassof390d2c2004-09-10 20:48:21 +00002846 }
hasso3fdb2dd2005-09-28 18:45:54 +00002847 /* ISIS - Dynamic hostname - Defaults to true so only display if
2848 * false. */
hassof390d2c2004-09-10 20:48:21 +00002849 if (!area->dynhostname)
2850 {
2851 vty_out (vty, " no hostname dynamic%s", VTY_NEWLINE);
2852 write++;
2853 }
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002854 /* ISIS - Metric-Style - when true displays wide */
2855 if (area->newmetric)
hassof390d2c2004-09-10 20:48:21 +00002856 {
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002857 if (!area->oldmetric)
2858 vty_out (vty, " metric-style wide%s", VTY_NEWLINE);
hasso2984d262005-09-26 16:49:07 +00002859 else
2860 vty_out (vty, " metric-style transition%s", VTY_NEWLINE);
hassof390d2c2004-09-10 20:48:21 +00002861 write++;
2862 }
Christian Frankef818c8f2012-11-27 01:10:28 +00002863 else
2864 {
2865 vty_out (vty, " metric-style narrow%s", VTY_NEWLINE);
2866 write++;
2867 }
Josh Bailey3f045a02012-03-24 08:35:20 -07002868 /* ISIS - overload-bit */
2869 if (area->overload_bit)
2870 {
2871 vty_out (vty, " set-overload-bit%s", VTY_NEWLINE);
2872 write++;
2873 }
hassof390d2c2004-09-10 20:48:21 +00002874 /* ISIS - Area is-type (level-1-2 is default) */
2875 if (area->is_type == IS_LEVEL_1)
2876 {
2877 vty_out (vty, " is-type level-1%s", VTY_NEWLINE);
2878 write++;
2879 }
Josh Bailey3f045a02012-03-24 08:35:20 -07002880 else if (area->is_type == IS_LEVEL_2)
hassof390d2c2004-09-10 20:48:21 +00002881 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002882 vty_out (vty, " is-type level-2-only%s", VTY_NEWLINE);
2883 write++;
hassof390d2c2004-09-10 20:48:21 +00002884 }
2885 /* ISIS - Lsp generation interval */
2886 if (area->lsp_gen_interval[0] == area->lsp_gen_interval[1])
2887 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002888 if (area->lsp_gen_interval[0] != DEFAULT_MIN_LSP_GEN_INTERVAL)
hassof390d2c2004-09-10 20:48:21 +00002889 {
2890 vty_out (vty, " lsp-gen-interval %d%s",
2891 area->lsp_gen_interval[0], VTY_NEWLINE);
2892 write++;
2893 }
2894 }
2895 else
2896 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002897 if (area->lsp_gen_interval[0] != DEFAULT_MIN_LSP_GEN_INTERVAL)
hassof390d2c2004-09-10 20:48:21 +00002898 {
2899 vty_out (vty, " lsp-gen-interval level-1 %d%s",
2900 area->lsp_gen_interval[0], VTY_NEWLINE);
2901 write++;
2902 }
Josh Bailey3f045a02012-03-24 08:35:20 -07002903 if (area->lsp_gen_interval[1] != DEFAULT_MIN_LSP_GEN_INTERVAL)
hassof390d2c2004-09-10 20:48:21 +00002904 {
2905 vty_out (vty, " lsp-gen-interval level-2 %d%s",
2906 area->lsp_gen_interval[1], VTY_NEWLINE);
2907 write++;
2908 }
2909 }
2910 /* ISIS - LSP lifetime */
2911 if (area->max_lsp_lifetime[0] == area->max_lsp_lifetime[1])
2912 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002913 if (area->max_lsp_lifetime[0] != DEFAULT_LSP_LIFETIME)
hassof390d2c2004-09-10 20:48:21 +00002914 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002915 vty_out (vty, " max-lsp-lifetime %u%s", area->max_lsp_lifetime[0],
hassof390d2c2004-09-10 20:48:21 +00002916 VTY_NEWLINE);
2917 write++;
2918 }
2919 }
2920 else
2921 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002922 if (area->max_lsp_lifetime[0] != DEFAULT_LSP_LIFETIME)
hassof390d2c2004-09-10 20:48:21 +00002923 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002924 vty_out (vty, " max-lsp-lifetime level-1 %u%s",
hassof390d2c2004-09-10 20:48:21 +00002925 area->max_lsp_lifetime[0], VTY_NEWLINE);
2926 write++;
2927 }
Josh Bailey3f045a02012-03-24 08:35:20 -07002928 if (area->max_lsp_lifetime[1] != DEFAULT_LSP_LIFETIME)
hassof390d2c2004-09-10 20:48:21 +00002929 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002930 vty_out (vty, " max-lsp-lifetime level-2 %u%s",
hassof390d2c2004-09-10 20:48:21 +00002931 area->max_lsp_lifetime[1], VTY_NEWLINE);
2932 write++;
2933 }
2934 }
Josh Bailey3f045a02012-03-24 08:35:20 -07002935 /* ISIS - LSP refresh interval */
2936 if (area->lsp_refresh[0] == area->lsp_refresh[1])
2937 {
2938 if (area->lsp_refresh[0] != DEFAULT_MAX_LSP_GEN_INTERVAL)
2939 {
2940 vty_out (vty, " lsp-refresh-interval %u%s", area->lsp_refresh[0],
2941 VTY_NEWLINE);
2942 write++;
2943 }
2944 }
2945 else
2946 {
2947 if (area->lsp_refresh[0] != DEFAULT_MAX_LSP_GEN_INTERVAL)
2948 {
2949 vty_out (vty, " lsp-refresh-interval level-1 %u%s",
2950 area->lsp_refresh[0], VTY_NEWLINE);
2951 write++;
2952 }
2953 if (area->lsp_refresh[1] != DEFAULT_MAX_LSP_GEN_INTERVAL)
2954 {
2955 vty_out (vty, " lsp-refresh-interval level-2 %u%s",
2956 area->lsp_refresh[1], VTY_NEWLINE);
2957 write++;
2958 }
2959 }
hasso13fb40a2005-10-01 06:03:04 +00002960 /* Minimum SPF interval. */
2961 if (area->min_spf_interval[0] == area->min_spf_interval[1])
2962 {
2963 if (area->min_spf_interval[0] != MINIMUM_SPF_INTERVAL)
2964 {
2965 vty_out (vty, " spf-interval %d%s",
2966 area->min_spf_interval[0], VTY_NEWLINE);
2967 write++;
2968 }
2969 }
2970 else
2971 {
2972 if (area->min_spf_interval[0] != MINIMUM_SPF_INTERVAL)
2973 {
2974 vty_out (vty, " spf-interval level-1 %d%s",
2975 area->min_spf_interval[0], VTY_NEWLINE);
2976 write++;
2977 }
2978 if (area->min_spf_interval[1] != MINIMUM_SPF_INTERVAL)
2979 {
2980 vty_out (vty, " spf-interval level-2 %d%s",
2981 area->min_spf_interval[1], VTY_NEWLINE);
2982 write++;
2983 }
2984 }
hasso53c997c2004-09-15 16:21:59 +00002985 /* Authentication passwords. */
Josh Bailey3f045a02012-03-24 08:35:20 -07002986 if (area->area_passwd.type == ISIS_PASSWD_TYPE_HMAC_MD5)
hasso53c997c2004-09-15 16:21:59 +00002987 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002988 vty_out(vty, " area-password md5 %s", area->area_passwd.passwd);
hasso1cbc5622005-01-01 10:29:51 +00002989 if (CHECK_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND))
2990 {
2991 vty_out(vty, " authenticate snp ");
2992 if (CHECK_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV))
2993 vty_out(vty, "validate");
2994 else
2995 vty_out(vty, "send-only");
2996 }
2997 vty_out(vty, "%s", VTY_NEWLINE);
hasso53c997c2004-09-15 16:21:59 +00002998 write++;
Josh Bailey3f045a02012-03-24 08:35:20 -07002999 }
3000 else if (area->area_passwd.type == ISIS_PASSWD_TYPE_CLEARTXT)
3001 {
3002 vty_out(vty, " area-password clear %s", area->area_passwd.passwd);
3003 if (CHECK_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND))
3004 {
3005 vty_out(vty, " authenticate snp ");
3006 if (CHECK_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV))
3007 vty_out(vty, "validate");
3008 else
3009 vty_out(vty, "send-only");
3010 }
3011 vty_out(vty, "%s", VTY_NEWLINE);
3012 write++;
3013 }
3014 if (area->domain_passwd.type == ISIS_PASSWD_TYPE_HMAC_MD5)
hasso53c997c2004-09-15 16:21:59 +00003015 {
Josh Bailey3f045a02012-03-24 08:35:20 -07003016 vty_out(vty, " domain-password md5 %s",
3017 area->domain_passwd.passwd);
3018 if (CHECK_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND))
3019 {
3020 vty_out(vty, " authenticate snp ");
3021 if (CHECK_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV))
3022 vty_out(vty, "validate");
3023 else
3024 vty_out(vty, "send-only");
3025 }
3026 vty_out(vty, "%s", VTY_NEWLINE);
3027 write++;
3028 }
3029 else if (area->domain_passwd.type == ISIS_PASSWD_TYPE_CLEARTXT)
3030 {
3031 vty_out(vty, " domain-password clear %s",
3032 area->domain_passwd.passwd);
hasso1cbc5622005-01-01 10:29:51 +00003033 if (CHECK_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND))
3034 {
3035 vty_out(vty, " authenticate snp ");
3036 if (CHECK_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV))
3037 vty_out(vty, "validate");
3038 else
3039 vty_out(vty, "send-only");
3040 }
3041 vty_out(vty, "%s", VTY_NEWLINE);
hasso53c997c2004-09-15 16:21:59 +00003042 write++;
3043 }
hassof1082d12005-09-19 04:23:34 +00003044
Josh Bailey3f045a02012-03-24 08:35:20 -07003045 if (area->log_adj_changes)
3046 {
3047 vty_out (vty, " log-adjacency-changes%s", VTY_NEWLINE);
3048 write++;
3049 }
3050
hassof390d2c2004-09-10 20:48:21 +00003051#ifdef TOPOLOGY_GENERATE
hassof1082d12005-09-19 04:23:34 +00003052 if (memcmp (area->topology_baseis, DEFAULT_TOPOLOGY_BASEIS,
3053 ISIS_SYS_ID_LEN))
3054 {
3055 vty_out (vty, " topology base-is %s%s",
Josh Bailey3f045a02012-03-24 08:35:20 -07003056 sysid_print ((u_char *)area->topology_baseis), VTY_NEWLINE);
hassof1082d12005-09-19 04:23:34 +00003057 write++;
3058 }
3059 if (area->topology_basedynh)
3060 {
3061 vty_out (vty, " topology base-dynh %s%s",
3062 area->topology_basedynh, VTY_NEWLINE);
3063 write++;
3064 }
3065 /* We save the whole command line here. */
3066 if (strlen(area->top_params))
hassof390d2c2004-09-10 20:48:21 +00003067 {
3068 vty_out (vty, " %s%s", area->top_params, VTY_NEWLINE);
3069 write++;
3070 }
hassof390d2c2004-09-10 20:48:21 +00003071#endif /* TOPOLOGY_GENERATE */
hassof1082d12005-09-19 04:23:34 +00003072
hassof390d2c2004-09-10 20:48:21 +00003073 }
jardineb5d44e2003-12-23 08:09:43 +00003074 }
hassof390d2c2004-09-10 20:48:21 +00003075
jardineb5d44e2003-12-23 08:09:43 +00003076 return write;
3077}
3078
Josh Bailey3f045a02012-03-24 08:35:20 -07003079struct cmd_node isis_node = {
jardineb5d44e2003-12-23 08:09:43 +00003080 ISIS_NODE,
hasso2097cd82003-12-23 11:51:08 +00003081 "%s(config-router)# ",
jardineb5d44e2003-12-23 08:09:43 +00003082 1
3083};
3084
hassof390d2c2004-09-10 20:48:21 +00003085void
jardineb5d44e2003-12-23 08:09:43 +00003086isis_init ()
3087{
jardineb5d44e2003-12-23 08:09:43 +00003088 /* Install IS-IS top node */
3089 install_node (&isis_node, isis_config_write);
hassof390d2c2004-09-10 20:48:21 +00003090
Josh Bailey3f045a02012-03-24 08:35:20 -07003091 install_element (VIEW_NODE, &show_isis_summary_cmd);
3092
3093 install_element (VIEW_NODE, &show_isis_interface_cmd);
3094 install_element (VIEW_NODE, &show_isis_interface_detail_cmd);
3095 install_element (VIEW_NODE, &show_isis_interface_arg_cmd);
3096
3097 install_element (VIEW_NODE, &show_isis_neighbor_cmd);
3098 install_element (VIEW_NODE, &show_isis_neighbor_detail_cmd);
3099 install_element (VIEW_NODE, &show_isis_neighbor_arg_cmd);
3100 install_element (VIEW_NODE, &clear_isis_neighbor_cmd);
3101 install_element (VIEW_NODE, &clear_isis_neighbor_arg_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003102
3103 install_element (VIEW_NODE, &show_hostname_cmd);
3104 install_element (VIEW_NODE, &show_database_cmd);
Josh Bailey3f045a02012-03-24 08:35:20 -07003105 install_element (VIEW_NODE, &show_database_arg_cmd);
3106 install_element (VIEW_NODE, &show_database_arg_detail_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003107 install_element (VIEW_NODE, &show_database_detail_cmd);
Josh Bailey3f045a02012-03-24 08:35:20 -07003108 install_element (VIEW_NODE, &show_database_detail_arg_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003109
Josh Bailey3f045a02012-03-24 08:35:20 -07003110 install_element (ENABLE_NODE, &show_isis_summary_cmd);
3111
3112 install_element (ENABLE_NODE, &show_isis_interface_cmd);
3113 install_element (ENABLE_NODE, &show_isis_interface_detail_cmd);
3114 install_element (ENABLE_NODE, &show_isis_interface_arg_cmd);
3115
3116 install_element (ENABLE_NODE, &show_isis_neighbor_cmd);
3117 install_element (ENABLE_NODE, &show_isis_neighbor_detail_cmd);
3118 install_element (ENABLE_NODE, &show_isis_neighbor_arg_cmd);
3119 install_element (ENABLE_NODE, &clear_isis_neighbor_cmd);
3120 install_element (ENABLE_NODE, &clear_isis_neighbor_arg_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003121
3122 install_element (ENABLE_NODE, &show_hostname_cmd);
3123 install_element (ENABLE_NODE, &show_database_cmd);
Josh Bailey3f045a02012-03-24 08:35:20 -07003124 install_element (ENABLE_NODE, &show_database_arg_cmd);
3125 install_element (ENABLE_NODE, &show_database_arg_detail_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003126 install_element (ENABLE_NODE, &show_database_detail_cmd);
Josh Bailey3f045a02012-03-24 08:35:20 -07003127 install_element (ENABLE_NODE, &show_database_detail_arg_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003128 install_element (ENABLE_NODE, &show_debugging_cmd);
3129
hassof390d2c2004-09-10 20:48:21 +00003130 install_node (&debug_node, config_write_debug);
jardin9e867fe2003-12-23 08:56:18 +00003131
jardineb5d44e2003-12-23 08:09:43 +00003132 install_element (ENABLE_NODE, &debug_isis_adj_cmd);
3133 install_element (ENABLE_NODE, &no_debug_isis_adj_cmd);
3134 install_element (ENABLE_NODE, &debug_isis_csum_cmd);
3135 install_element (ENABLE_NODE, &no_debug_isis_csum_cmd);
3136 install_element (ENABLE_NODE, &debug_isis_lupd_cmd);
3137 install_element (ENABLE_NODE, &no_debug_isis_lupd_cmd);
3138 install_element (ENABLE_NODE, &debug_isis_err_cmd);
3139 install_element (ENABLE_NODE, &no_debug_isis_err_cmd);
3140 install_element (ENABLE_NODE, &debug_isis_snp_cmd);
3141 install_element (ENABLE_NODE, &no_debug_isis_snp_cmd);
3142 install_element (ENABLE_NODE, &debug_isis_upd_cmd);
3143 install_element (ENABLE_NODE, &no_debug_isis_upd_cmd);
3144 install_element (ENABLE_NODE, &debug_isis_spfevents_cmd);
3145 install_element (ENABLE_NODE, &no_debug_isis_spfevents_cmd);
3146 install_element (ENABLE_NODE, &debug_isis_spfstats_cmd);
3147 install_element (ENABLE_NODE, &no_debug_isis_spfstats_cmd);
3148 install_element (ENABLE_NODE, &debug_isis_spftrigg_cmd);
3149 install_element (ENABLE_NODE, &no_debug_isis_spftrigg_cmd);
3150 install_element (ENABLE_NODE, &debug_isis_rtevents_cmd);
3151 install_element (ENABLE_NODE, &no_debug_isis_rtevents_cmd);
3152 install_element (ENABLE_NODE, &debug_isis_events_cmd);
3153 install_element (ENABLE_NODE, &no_debug_isis_events_cmd);
Josh Bailey3f045a02012-03-24 08:35:20 -07003154 install_element (ENABLE_NODE, &debug_isis_packet_dump_cmd);
3155 install_element (ENABLE_NODE, &no_debug_isis_packet_dump_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003156
jardin9e867fe2003-12-23 08:56:18 +00003157 install_element (CONFIG_NODE, &debug_isis_adj_cmd);
3158 install_element (CONFIG_NODE, &no_debug_isis_adj_cmd);
3159 install_element (CONFIG_NODE, &debug_isis_csum_cmd);
3160 install_element (CONFIG_NODE, &no_debug_isis_csum_cmd);
3161 install_element (CONFIG_NODE, &debug_isis_lupd_cmd);
3162 install_element (CONFIG_NODE, &no_debug_isis_lupd_cmd);
3163 install_element (CONFIG_NODE, &debug_isis_err_cmd);
3164 install_element (CONFIG_NODE, &no_debug_isis_err_cmd);
3165 install_element (CONFIG_NODE, &debug_isis_snp_cmd);
3166 install_element (CONFIG_NODE, &no_debug_isis_snp_cmd);
3167 install_element (CONFIG_NODE, &debug_isis_upd_cmd);
3168 install_element (CONFIG_NODE, &no_debug_isis_upd_cmd);
3169 install_element (CONFIG_NODE, &debug_isis_spfevents_cmd);
3170 install_element (CONFIG_NODE, &no_debug_isis_spfevents_cmd);
3171 install_element (CONFIG_NODE, &debug_isis_spfstats_cmd);
3172 install_element (CONFIG_NODE, &no_debug_isis_spfstats_cmd);
3173 install_element (CONFIG_NODE, &debug_isis_spftrigg_cmd);
3174 install_element (CONFIG_NODE, &no_debug_isis_spftrigg_cmd);
3175 install_element (CONFIG_NODE, &debug_isis_rtevents_cmd);
3176 install_element (CONFIG_NODE, &no_debug_isis_rtevents_cmd);
3177 install_element (CONFIG_NODE, &debug_isis_events_cmd);
3178 install_element (CONFIG_NODE, &no_debug_isis_events_cmd);
Josh Bailey3f045a02012-03-24 08:35:20 -07003179 install_element (CONFIG_NODE, &debug_isis_packet_dump_cmd);
3180 install_element (CONFIG_NODE, &no_debug_isis_packet_dump_cmd);
jardin9e867fe2003-12-23 08:56:18 +00003181
jardineb5d44e2003-12-23 08:09:43 +00003182 install_element (CONFIG_NODE, &router_isis_cmd);
3183 install_element (CONFIG_NODE, &no_router_isis_cmd);
3184
3185 install_default (ISIS_NODE);
3186
3187 install_element (ISIS_NODE, &net_cmd);
3188 install_element (ISIS_NODE, &no_net_cmd);
3189
3190 install_element (ISIS_NODE, &is_type_cmd);
3191 install_element (ISIS_NODE, &no_is_type_cmd);
3192
Josh Bailey3f045a02012-03-24 08:35:20 -07003193 install_element (ISIS_NODE, &area_passwd_md5_cmd);
3194 install_element (ISIS_NODE, &area_passwd_md5_snpauth_cmd);
3195 install_element (ISIS_NODE, &area_passwd_clear_cmd);
3196 install_element (ISIS_NODE, &area_passwd_clear_snpauth_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003197 install_element (ISIS_NODE, &no_area_passwd_cmd);
3198
Josh Bailey3f045a02012-03-24 08:35:20 -07003199 install_element (ISIS_NODE, &domain_passwd_md5_cmd);
3200 install_element (ISIS_NODE, &domain_passwd_md5_snpauth_cmd);
3201 install_element (ISIS_NODE, &domain_passwd_clear_cmd);
3202 install_element (ISIS_NODE, &domain_passwd_clear_snpauth_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003203 install_element (ISIS_NODE, &no_domain_passwd_cmd);
3204
3205 install_element (ISIS_NODE, &lsp_gen_interval_cmd);
3206 install_element (ISIS_NODE, &no_lsp_gen_interval_cmd);
3207 install_element (ISIS_NODE, &no_lsp_gen_interval_arg_cmd);
3208 install_element (ISIS_NODE, &lsp_gen_interval_l1_cmd);
3209 install_element (ISIS_NODE, &no_lsp_gen_interval_l1_cmd);
3210 install_element (ISIS_NODE, &no_lsp_gen_interval_l1_arg_cmd);
3211 install_element (ISIS_NODE, &lsp_gen_interval_l2_cmd);
3212 install_element (ISIS_NODE, &no_lsp_gen_interval_l2_cmd);
3213 install_element (ISIS_NODE, &no_lsp_gen_interval_l2_arg_cmd);
3214
3215 install_element (ISIS_NODE, &spf_interval_cmd);
3216 install_element (ISIS_NODE, &no_spf_interval_cmd);
3217 install_element (ISIS_NODE, &no_spf_interval_arg_cmd);
3218 install_element (ISIS_NODE, &spf_interval_l1_cmd);
3219 install_element (ISIS_NODE, &no_spf_interval_l1_cmd);
3220 install_element (ISIS_NODE, &no_spf_interval_l1_arg_cmd);
3221 install_element (ISIS_NODE, &spf_interval_l2_cmd);
3222 install_element (ISIS_NODE, &no_spf_interval_l2_cmd);
3223 install_element (ISIS_NODE, &no_spf_interval_l2_arg_cmd);
hassof390d2c2004-09-10 20:48:21 +00003224
Josh Bailey3f045a02012-03-24 08:35:20 -07003225 install_element (ISIS_NODE, &max_lsp_lifetime_cmd);
3226 install_element (ISIS_NODE, &no_max_lsp_lifetime_cmd);
3227 install_element (ISIS_NODE, &no_max_lsp_lifetime_arg_cmd);
3228 install_element (ISIS_NODE, &max_lsp_lifetime_l1_cmd);
3229 install_element (ISIS_NODE, &no_max_lsp_lifetime_l1_cmd);
3230 install_element (ISIS_NODE, &no_max_lsp_lifetime_l1_arg_cmd);
3231 install_element (ISIS_NODE, &max_lsp_lifetime_l2_cmd);
3232 install_element (ISIS_NODE, &no_max_lsp_lifetime_l2_cmd);
3233 install_element (ISIS_NODE, &no_max_lsp_lifetime_l2_arg_cmd);
3234
3235 install_element (ISIS_NODE, &lsp_refresh_interval_cmd);
3236 install_element (ISIS_NODE, &no_lsp_refresh_interval_cmd);
3237 install_element (ISIS_NODE, &no_lsp_refresh_interval_arg_cmd);
3238 install_element (ISIS_NODE, &lsp_refresh_interval_l1_cmd);
3239 install_element (ISIS_NODE, &no_lsp_refresh_interval_l1_cmd);
3240 install_element (ISIS_NODE, &no_lsp_refresh_interval_l1_arg_cmd);
3241 install_element (ISIS_NODE, &lsp_refresh_interval_l2_cmd);
3242 install_element (ISIS_NODE, &no_lsp_refresh_interval_l2_cmd);
3243 install_element (ISIS_NODE, &no_lsp_refresh_interval_l2_arg_cmd);
3244
3245 install_element (ISIS_NODE, &set_overload_bit_cmd);
3246 install_element (ISIS_NODE, &no_set_overload_bit_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003247
3248 install_element (ISIS_NODE, &dynamic_hostname_cmd);
3249 install_element (ISIS_NODE, &no_dynamic_hostname_cmd);
3250
3251 install_element (ISIS_NODE, &metric_style_cmd);
3252 install_element (ISIS_NODE, &no_metric_style_cmd);
Josh Bailey3f045a02012-03-24 08:35:20 -07003253
3254 install_element (ISIS_NODE, &log_adj_changes_cmd);
3255 install_element (ISIS_NODE, &no_log_adj_changes_cmd);
3256
jardineb5d44e2003-12-23 08:09:43 +00003257#ifdef TOPOLOGY_GENERATE
3258 install_element (ISIS_NODE, &topology_generate_grid_cmd);
3259 install_element (ISIS_NODE, &topology_baseis_cmd);
hassof1082d12005-09-19 04:23:34 +00003260 install_element (ISIS_NODE, &topology_basedynh_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003261 install_element (ISIS_NODE, &no_topology_baseis_cmd);
hassof1082d12005-09-19 04:23:34 +00003262 install_element (ISIS_NODE, &no_topology_baseis_noid_cmd);
hassof695b012005-04-02 19:03:39 +00003263 install_element (VIEW_NODE, &show_isis_generated_topology_cmd);
3264 install_element (ENABLE_NODE, &show_isis_generated_topology_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003265#endif /* TOPOLOGY_GENERATE */
jardineb5d44e2003-12-23 08:09:43 +00003266}