blob: e8e3d9f0ad9f043c8821e8f80b99848b531da480 [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
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07001300 vty_out (vty, " last run duration : %u msec%s",
1301 spftree->last_run_duration, VTY_NEWLINE);
1302
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) &&
2057 (circuit->metrics[0].metric_default > MAX_NARROW_LINK_METRIC))
2058 {
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) &&
2065 (circuit->metrics[1].metric_default > MAX_NARROW_LINK_METRIC))
2066 {
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 }
2095 else if (strncmp (argv[0], "t", 1) == 0)
2096 {
2097 area->newmetric = 1;
2098 area->oldmetric = 1;
2099 }
2100 else if (strncmp (argv[0], "n", 1) == 0)
2101 {
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002102 ret = validate_metric_style_narrow (vty, area);
2103 if (ret != CMD_SUCCESS)
2104 return ret;
2105
hasso2984d262005-09-26 16:49:07 +00002106 area->newmetric = 0;
2107 area->oldmetric = 1;
2108 }
jardineb5d44e2003-12-23 08:09:43 +00002109
2110 return CMD_SUCCESS;
2111}
2112
2113DEFUN (no_metric_style,
2114 no_metric_style_cmd,
hasso2984d262005-09-26 16:49:07 +00002115 "no metric-style",
jardineb5d44e2003-12-23 08:09:43 +00002116 NO_STR
hasso2984d262005-09-26 16:49:07 +00002117 "Use old-style (ISO 10589) or new-style packet formats\n")
jardineb5d44e2003-12-23 08:09:43 +00002118{
2119 struct isis_area *area;
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002120 int ret;
jardineb5d44e2003-12-23 08:09:43 +00002121
2122 area = vty->index;
2123 assert (area);
2124
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002125 ret = validate_metric_style_narrow (vty, area);
2126 if (ret != CMD_SUCCESS)
2127 return ret;
2128
hasso2984d262005-09-26 16:49:07 +00002129 /* Default is narrow metric. */
2130 area->newmetric = 0;
2131 area->oldmetric = 1;
jardineb5d44e2003-12-23 08:09:43 +00002132
2133 return CMD_SUCCESS;
2134}
2135
Josh Bailey3f045a02012-03-24 08:35:20 -07002136DEFUN (set_overload_bit,
2137 set_overload_bit_cmd,
2138 "set-overload-bit",
2139 "Set overload bit to avoid any transit traffic\n"
2140 "Set overload bit\n")
2141{
2142 struct isis_area *area;
2143
2144 area = vty->index;
2145 assert (area);
2146
2147 area->overload_bit = LSPBIT_OL;
2148 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
2149
2150 return CMD_SUCCESS;
2151}
2152
2153DEFUN (no_set_overload_bit,
2154 no_set_overload_bit_cmd,
2155 "no set-overload-bit",
2156 "Reset overload bit to accept transit traffic\n"
2157 "Reset overload bit\n")
2158{
2159 struct isis_area *area;
2160
2161 area = vty->index;
2162 assert (area);
2163
2164 area->overload_bit = 0;
2165 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
2166
2167 return CMD_SUCCESS;
2168}
2169
jardineb5d44e2003-12-23 08:09:43 +00002170DEFUN (dynamic_hostname,
2171 dynamic_hostname_cmd,
2172 "hostname dynamic",
2173 "Dynamic hostname for IS-IS\n"
hassof390d2c2004-09-10 20:48:21 +00002174 "Dynamic hostname\n")
jardineb5d44e2003-12-23 08:09:43 +00002175{
2176 struct isis_area *area;
2177
2178 area = vty->index;
2179 assert (area);
hassof390d2c2004-09-10 20:48:21 +00002180
Josh Bailey3f045a02012-03-24 08:35:20 -07002181 if (!area->dynhostname)
2182 {
2183 area->dynhostname = 1;
2184 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 0);
2185 }
hassof390d2c2004-09-10 20:48:21 +00002186
jardineb5d44e2003-12-23 08:09:43 +00002187 return CMD_SUCCESS;
2188}
2189
2190DEFUN (no_dynamic_hostname,
2191 no_dynamic_hostname_cmd,
2192 "no hostname dynamic",
2193 NO_STR
2194 "Dynamic hostname for IS-IS\n"
hassof390d2c2004-09-10 20:48:21 +00002195 "Dynamic hostname\n")
jardineb5d44e2003-12-23 08:09:43 +00002196{
2197 struct isis_area *area;
2198
2199 area = vty->index;
2200 assert (area);
hassof390d2c2004-09-10 20:48:21 +00002201
Josh Bailey3f045a02012-03-24 08:35:20 -07002202 if (area->dynhostname)
2203 {
2204 area->dynhostname = 0;
2205 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 0);
2206 }
hassof390d2c2004-09-10 20:48:21 +00002207
jardineb5d44e2003-12-23 08:09:43 +00002208 return CMD_SUCCESS;
2209}
2210
2211DEFUN (spf_interval,
2212 spf_interval_cmd,
2213 "spf-interval <1-120>",
hasso2097cd82003-12-23 11:51:08 +00002214 "Minimum interval between SPF calculations\n"
jardineb5d44e2003-12-23 08:09:43 +00002215 "Minimum interval between consecutive SPFs in seconds\n")
2216{
2217 struct isis_area *area;
2218 u_int16_t interval;
hassof390d2c2004-09-10 20:48:21 +00002219
jardineb5d44e2003-12-23 08:09:43 +00002220 area = vty->index;
2221 interval = atoi (argv[0]);
2222 area->min_spf_interval[0] = interval;
2223 area->min_spf_interval[1] = interval;
hassof390d2c2004-09-10 20:48:21 +00002224
jardineb5d44e2003-12-23 08:09:43 +00002225 return CMD_SUCCESS;
2226}
2227
2228DEFUN (no_spf_interval,
2229 no_spf_interval_cmd,
2230 "no spf-interval",
2231 NO_STR
hassof390d2c2004-09-10 20:48:21 +00002232 "Minimum interval between SPF calculations\n")
jardineb5d44e2003-12-23 08:09:43 +00002233{
2234 struct isis_area *area;
hassof390d2c2004-09-10 20:48:21 +00002235
jardineb5d44e2003-12-23 08:09:43 +00002236 area = vty->index;
2237
2238 area->min_spf_interval[0] = MINIMUM_SPF_INTERVAL;
2239 area->min_spf_interval[1] = MINIMUM_SPF_INTERVAL;
hassof390d2c2004-09-10 20:48:21 +00002240
jardineb5d44e2003-12-23 08:09:43 +00002241 return CMD_SUCCESS;
2242}
2243
2244ALIAS (no_spf_interval,
2245 no_spf_interval_arg_cmd,
2246 "no spf-interval <1-120>",
2247 NO_STR
2248 "Minimum interval between SPF calculations\n"
hassof390d2c2004-09-10 20:48:21 +00002249 "Minimum interval between consecutive SPFs in seconds\n")
jardineb5d44e2003-12-23 08:09:43 +00002250
2251DEFUN (spf_interval_l1,
2252 spf_interval_l1_cmd,
2253 "spf-interval level-1 <1-120>",
2254 "Minimum interval between SPF calculations\n"
2255 "Set interval for level 1 only\n"
2256 "Minimum interval between consecutive SPFs in seconds\n")
2257{
2258 struct isis_area *area;
2259 u_int16_t interval;
hassof390d2c2004-09-10 20:48:21 +00002260
jardineb5d44e2003-12-23 08:09:43 +00002261 area = vty->index;
2262 interval = atoi (argv[0]);
2263 area->min_spf_interval[0] = interval;
hassof390d2c2004-09-10 20:48:21 +00002264
jardineb5d44e2003-12-23 08:09:43 +00002265 return CMD_SUCCESS;
2266}
2267
2268DEFUN (no_spf_interval_l1,
2269 no_spf_interval_l1_cmd,
2270 "no spf-interval level-1",
2271 NO_STR
2272 "Minimum interval between SPF calculations\n"
2273 "Set interval for level 1 only\n")
2274{
2275 struct isis_area *area;
hassof390d2c2004-09-10 20:48:21 +00002276
jardineb5d44e2003-12-23 08:09:43 +00002277 area = vty->index;
2278
2279 area->min_spf_interval[0] = MINIMUM_SPF_INTERVAL;
hassof390d2c2004-09-10 20:48:21 +00002280
jardineb5d44e2003-12-23 08:09:43 +00002281 return CMD_SUCCESS;
2282}
2283
2284ALIAS (no_spf_interval,
2285 no_spf_interval_l1_arg_cmd,
2286 "no spf-interval level-1 <1-120>",
2287 NO_STR
2288 "Minimum interval between SPF calculations\n"
2289 "Set interval for level 1 only\n"
2290 "Minimum interval between consecutive SPFs in seconds\n")
2291
2292DEFUN (spf_interval_l2,
2293 spf_interval_l2_cmd,
2294 "spf-interval level-2 <1-120>",
2295 "Minimum interval between SPF calculations\n"
2296 "Set interval for level 2 only\n"
2297 "Minimum interval between consecutive SPFs in seconds\n")
2298{
2299 struct isis_area *area;
2300 u_int16_t interval;
hassof390d2c2004-09-10 20:48:21 +00002301
jardineb5d44e2003-12-23 08:09:43 +00002302 area = vty->index;
2303 interval = atoi (argv[0]);
2304 area->min_spf_interval[1] = interval;
hassof390d2c2004-09-10 20:48:21 +00002305
jardineb5d44e2003-12-23 08:09:43 +00002306 return CMD_SUCCESS;
2307}
2308
2309DEFUN (no_spf_interval_l2,
2310 no_spf_interval_l2_cmd,
2311 "no spf-interval level-2",
2312 NO_STR
2313 "Minimum interval between SPF calculations\n"
2314 "Set interval for level 2 only\n")
2315{
2316 struct isis_area *area;
hassof390d2c2004-09-10 20:48:21 +00002317
jardineb5d44e2003-12-23 08:09:43 +00002318 area = vty->index;
2319
2320 area->min_spf_interval[1] = MINIMUM_SPF_INTERVAL;
hassof390d2c2004-09-10 20:48:21 +00002321
jardineb5d44e2003-12-23 08:09:43 +00002322 return CMD_SUCCESS;
2323}
2324
2325ALIAS (no_spf_interval,
2326 no_spf_interval_l2_arg_cmd,
2327 "no spf-interval level-2 <1-120>",
2328 NO_STR
2329 "Minimum interval between SPF calculations\n"
2330 "Set interval for level 2 only\n"
2331 "Minimum interval between consecutive SPFs in seconds\n")
2332
Josh Bailey3f045a02012-03-24 08:35:20 -07002333static int
2334set_lsp_max_lifetime (struct vty *vty, struct isis_area *area,
2335 uint16_t interval, int level)
2336{
2337 int lvl;
2338 int set_refresh_interval[ISIS_LEVELS] = {0, 0};
2339 uint16_t refresh_interval;
2340
2341 refresh_interval = interval - 300;
2342
2343 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; lvl++)
2344 {
2345 if (!(lvl & level))
2346 continue;
2347 if (refresh_interval < area->lsp_refresh[lvl-1])
2348 {
2349 vty_out (vty, "Level %d Max LSP lifetime %us must be 300s greater than "
2350 "the configured LSP refresh interval %us%s",
2351 lvl, interval, area->lsp_refresh[lvl-1], VTY_NEWLINE);
2352 vty_out (vty, "Automatically reducing level %d LSP refresh interval "
2353 "to %us%s", lvl, refresh_interval, VTY_NEWLINE);
2354 set_refresh_interval[lvl-1] = 1;
2355
2356 if (refresh_interval <= area->lsp_gen_interval[lvl-1])
2357 {
2358 vty_out (vty, "LSP refresh interval %us must be greater than "
2359 "the configured LSP gen interval %us%s",
2360 refresh_interval, area->lsp_gen_interval[lvl-1],
2361 VTY_NEWLINE);
2362 return CMD_ERR_AMBIGUOUS;
2363 }
2364 }
2365 }
2366
2367 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; lvl++)
2368 {
2369 if (!(lvl & level))
2370 continue;
2371 area->max_lsp_lifetime[lvl-1] = interval;
2372 /* Automatically reducing lsp_refresh_interval to interval - 300 */
2373 if (set_refresh_interval[lvl-1])
2374 area->lsp_refresh[lvl-1] = refresh_interval;
2375 }
2376
2377 lsp_regenerate_schedule (area, level, 1);
2378
2379 return CMD_SUCCESS;
2380}
2381
2382DEFUN (max_lsp_lifetime,
2383 max_lsp_lifetime_cmd,
2384 "max-lsp-lifetime <350-65535>",
2385 "Maximum LSP lifetime\n"
2386 "LSP lifetime in seconds\n")
2387{
2388 struct isis_area *area;
2389 uint16_t interval;
2390 int level;
2391
2392 area = vty->index;
2393 interval = atoi (argv[0]);
2394 level = IS_LEVEL_1 | IS_LEVEL_2;
2395 return set_lsp_max_lifetime (vty, area, interval, level);
2396}
2397
2398DEFUN (no_max_lsp_lifetime,
2399 no_max_lsp_lifetime_cmd,
2400 "no max-lsp-lifetime",
2401 NO_STR
2402 "LSP lifetime in seconds\n")
2403{
2404 struct isis_area *area;
2405 uint16_t interval;
2406 int level;
2407
2408 area = vty->index;
2409 interval = DEFAULT_LSP_LIFETIME;
2410 level = IS_LEVEL_1 | IS_LEVEL_2;
2411 return set_lsp_max_lifetime (vty, area, interval, level);
2412}
2413
2414ALIAS (no_max_lsp_lifetime,
2415 no_max_lsp_lifetime_arg_cmd,
2416 "no max-lsp-lifetime <350-65535>",
2417 NO_STR
2418 "Maximum LSP lifetime\n"
2419 "LSP lifetime in seconds\n")
2420
2421DEFUN (max_lsp_lifetime_l1,
2422 max_lsp_lifetime_l1_cmd,
2423 "max-lsp-lifetime level-1 <350-65535>",
2424 "Maximum LSP lifetime for Level 1 only\n"
2425 "LSP lifetime for Level 1 only in seconds\n")
2426{
2427 struct isis_area *area;
2428 uint16_t interval;
2429 int level;
2430
2431 area = vty->index;
2432 interval = atoi (argv[0]);
2433 level = IS_LEVEL_1;
2434 return set_lsp_max_lifetime (vty, area, interval, level);
2435}
2436
2437DEFUN (no_max_lsp_lifetime_l1,
2438 no_max_lsp_lifetime_l1_cmd,
2439 "no max-lsp-lifetime level-1",
2440 NO_STR
2441 "LSP lifetime for Level 1 only in seconds\n")
2442{
2443 struct isis_area *area;
2444 uint16_t interval;
2445 int level;
2446
2447 area = vty->index;
2448 interval = DEFAULT_LSP_LIFETIME;
2449 level = IS_LEVEL_1;
2450 return set_lsp_max_lifetime (vty, area, interval, level);
2451}
2452
2453ALIAS (no_max_lsp_lifetime_l1,
2454 no_max_lsp_lifetime_l1_arg_cmd,
2455 "no max-lsp-lifetime level-1 <350-65535>",
2456 NO_STR
2457 "Maximum LSP lifetime for Level 1 only\n"
2458 "LSP lifetime for Level 1 only in seconds\n")
2459
2460DEFUN (max_lsp_lifetime_l2,
2461 max_lsp_lifetime_l2_cmd,
2462 "max-lsp-lifetime level-2 <350-65535>",
2463 "Maximum LSP lifetime for Level 2 only\n"
2464 "LSP lifetime for Level 2 only in seconds\n")
2465{
2466 struct isis_area *area;
2467 uint16_t interval;
2468 int level;
2469
2470 area = vty->index;
2471 interval = atoi (argv[0]);
2472 level = IS_LEVEL_2;
2473 return set_lsp_max_lifetime (vty, area, interval, level);
2474}
2475
2476DEFUN (no_max_lsp_lifetime_l2,
2477 no_max_lsp_lifetime_l2_cmd,
2478 "no max-lsp-lifetime level-2",
2479 NO_STR
2480 "LSP lifetime for Level 2 only in seconds\n")
2481{
2482 struct isis_area *area;
2483 uint16_t interval;
2484 int level;
2485
2486 area = vty->index;
2487 interval = DEFAULT_LSP_LIFETIME;
2488 level = IS_LEVEL_2;
2489 return set_lsp_max_lifetime (vty, area, interval, level);
2490}
2491
2492ALIAS (no_max_lsp_lifetime_l2,
2493 no_max_lsp_lifetime_l2_arg_cmd,
2494 "no max-lsp-lifetime level-2 <350-65535>",
2495 NO_STR
2496 "Maximum LSP lifetime for Level 2 only\n"
2497 "LSP lifetime for Level 2 only in seconds\n")
2498
2499static int
2500set_lsp_refresh_interval (struct vty *vty, struct isis_area *area,
2501 uint16_t interval, int level)
2502{
2503 int lvl;
2504
2505 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl)
2506 {
2507 if (!(lvl & level))
2508 continue;
2509 if (interval <= area->lsp_gen_interval[lvl-1])
2510 {
2511 vty_out (vty, "LSP refresh interval %us must be greater than "
2512 "the configured LSP gen interval %us%s",
2513 interval, area->lsp_gen_interval[lvl-1],
2514 VTY_NEWLINE);
2515 return CMD_ERR_AMBIGUOUS;
2516 }
2517 if (interval > (area->max_lsp_lifetime[lvl-1] - 300))
2518 {
2519 vty_out (vty, "LSP refresh interval %us must be less than "
2520 "the configured LSP lifetime %us less 300%s",
2521 interval, area->max_lsp_lifetime[lvl-1],
2522 VTY_NEWLINE);
2523 return CMD_ERR_AMBIGUOUS;
2524 }
2525 }
2526
2527 for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl)
2528 {
2529 if (!(lvl & level))
2530 continue;
2531 area->lsp_refresh[lvl-1] = interval;
2532 }
2533 lsp_regenerate_schedule (area, level, 1);
2534
2535 return CMD_SUCCESS;
2536}
2537
2538DEFUN (lsp_refresh_interval,
2539 lsp_refresh_interval_cmd,
2540 "lsp-refresh-interval <1-65235>",
2541 "LSP refresh interval\n"
2542 "LSP refresh interval in seconds\n")
2543{
2544 struct isis_area *area;
2545 uint16_t interval;
2546 int level;
2547
2548 area = vty->index;
2549 interval = atoi (argv[0]);
2550 level = IS_LEVEL_1 | IS_LEVEL_2;
2551 return set_lsp_refresh_interval (vty, area, interval, level);
2552}
2553
2554DEFUN (no_lsp_refresh_interval,
2555 no_lsp_refresh_interval_cmd,
2556 "no lsp-refresh-interval",
2557 NO_STR
2558 "LSP refresh interval in seconds\n")
2559{
2560 struct isis_area *area;
2561 uint16_t interval;
2562 int level;
2563
2564 area = vty->index;
2565 interval = DEFAULT_MAX_LSP_GEN_INTERVAL;
2566 level = IS_LEVEL_1 | IS_LEVEL_2;
2567 return set_lsp_refresh_interval (vty, area, interval, level);
2568}
2569
2570ALIAS (no_lsp_refresh_interval,
2571 no_lsp_refresh_interval_arg_cmd,
2572 "no lsp-refresh-interval <1-65235>",
2573 NO_STR
2574 "LSP refresh interval\n"
2575 "LSP refresh interval in seconds\n")
2576
2577DEFUN (lsp_refresh_interval_l1,
2578 lsp_refresh_interval_l1_cmd,
2579 "lsp-refresh-interval level-1 <1-65235>",
2580 "LSP refresh interval for Level 1 only\n"
2581 "LSP refresh interval for Level 1 only in seconds\n")
2582{
2583 struct isis_area *area;
2584 uint16_t interval;
2585 int level;
2586
2587 area = vty->index;
2588 interval = atoi (argv[0]);
2589 level = IS_LEVEL_1;
2590 return set_lsp_refresh_interval (vty, area, interval, level);
2591}
2592
2593DEFUN (no_lsp_refresh_interval_l1,
2594 no_lsp_refresh_interval_l1_cmd,
2595 "no lsp-refresh-interval level-1",
2596 NO_STR
2597 "LSP refresh interval for Level 1 only in seconds\n")
2598{
2599 struct isis_area *area;
2600 uint16_t interval;
2601 int level;
2602
2603 area = vty->index;
2604 interval = DEFAULT_MAX_LSP_GEN_INTERVAL;
2605 level = IS_LEVEL_1;
2606 return set_lsp_refresh_interval (vty, area, interval, level);
2607}
2608
2609ALIAS (no_lsp_refresh_interval_l1,
2610 no_lsp_refresh_interval_l1_arg_cmd,
2611 "no lsp-refresh-interval level-1 <1-65235>",
2612 NO_STR
2613 "LSP refresh interval for Level 1 only\n"
2614 "LSP refresh interval for Level 1 only in seconds\n")
2615
2616DEFUN (lsp_refresh_interval_l2,
2617 lsp_refresh_interval_l2_cmd,
2618 "lsp-refresh-interval level-2 <1-65235>",
2619 "LSP refresh interval for Level 2 only\n"
2620 "LSP refresh interval for Level 2 only in seconds\n")
2621{
2622 struct isis_area *area;
2623 uint16_t interval;
2624 int level;
2625
2626 area = vty->index;
2627 interval = atoi (argv[0]);
2628 level = IS_LEVEL_2;
2629 return set_lsp_refresh_interval (vty, area, interval, level);
2630}
2631
2632DEFUN (no_lsp_refresh_interval_l2,
2633 no_lsp_refresh_interval_l2_cmd,
2634 "no lsp-refresh-interval level-2",
2635 NO_STR
2636 "LSP refresh interval for Level 2 only in seconds\n")
2637{
2638 struct isis_area *area;
2639 uint16_t interval;
2640 int level;
2641
2642 area = vty->index;
2643 interval = DEFAULT_MAX_LSP_GEN_INTERVAL;
2644 level = IS_LEVEL_2;
2645 return set_lsp_refresh_interval (vty, area, interval, level);
2646}
2647
2648ALIAS (no_lsp_refresh_interval_l2,
2649 no_lsp_refresh_interval_l2_arg_cmd,
2650 "no lsp-refresh-interval level-2 <1-65235>",
2651 NO_STR
2652 "LSP refresh interval for Level 2 only\n"
2653 "LSP refresh interval for Level 2 only in seconds\n")
2654
2655DEFUN (log_adj_changes,
2656 log_adj_changes_cmd,
2657 "log-adjacency-changes",
2658 "Log changes in adjacency state\n")
2659{
2660 struct isis_area *area;
2661
2662 area = vty->index;
2663 assert (area);
2664
2665 area->log_adj_changes = 1;
2666
2667 return CMD_SUCCESS;
2668}
2669
2670DEFUN (no_log_adj_changes,
2671 no_log_adj_changes_cmd,
2672 "no log-adjacency-changes",
2673 "Stop logging changes in adjacency state\n")
2674{
2675 struct isis_area *area;
2676
2677 area = vty->index;
2678 assert (area);
2679
2680 area->log_adj_changes = 0;
2681
2682 return CMD_SUCCESS;
2683}
2684
jardineb5d44e2003-12-23 08:09:43 +00002685#ifdef TOPOLOGY_GENERATE
Josh Bailey3f045a02012-03-24 08:35:20 -07002686
jardineb5d44e2003-12-23 08:09:43 +00002687DEFUN (topology_generate_grid,
2688 topology_generate_grid_cmd,
2689 "topology generate grid <1-100> <1-100> <1-65000> [param] [param] "
2690 "[param]",
hassof1082d12005-09-19 04:23:34 +00002691 "Topology generation for IS-IS\n"
2692 "Topology generation\n"
2693 "Grid topology\n"
jardineb5d44e2003-12-23 08:09:43 +00002694 "X parameter of the grid\n"
2695 "Y parameter of the grid\n"
2696 "Random seed\n"
2697 "Optional param 1\n"
2698 "Optional param 2\n"
2699 "Optional param 3\n"
2700 "Topology\n")
2701{
2702 struct isis_area *area;
2703
2704 area = vty->index;
2705 assert (area);
2706
hassof390d2c2004-09-10 20:48:21 +00002707 if (!spgrid_check_params (vty, argc, argv))
2708 {
2709 if (area->topology)
2710 list_delete (area->topology);
2711 area->topology = list_new ();
2712 memcpy (area->top_params, vty->buf, 200);
2713 gen_spgrid_topology (vty, area->topology);
2714 remove_topology_lsps (area);
2715 generate_topology_lsps (area);
hassof1082d12005-09-19 04:23:34 +00002716 /* Regenerate L1 LSP to get two way connection to the generated
2717 * topology. */
Josh Bailey3f045a02012-03-24 08:35:20 -07002718 lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
hassof390d2c2004-09-10 20:48:21 +00002719 }
jardineb5d44e2003-12-23 08:09:43 +00002720
2721 return CMD_SUCCESS;
2722}
2723
hassof695b012005-04-02 19:03:39 +00002724DEFUN (show_isis_generated_topology,
2725 show_isis_generated_topology_cmd,
hassof1082d12005-09-19 04:23:34 +00002726 "show isis generated-topologies",
jardineb5d44e2003-12-23 08:09:43 +00002727 SHOW_STR
Josh Bailey3f045a02012-03-24 08:35:20 -07002728 "ISIS network information\n"
hassof1082d12005-09-19 04:23:34 +00002729 "Show generated topologies\n")
jardineb5d44e2003-12-23 08:09:43 +00002730{
2731 struct isis_area *area;
paul92c9f222005-05-25 12:21:13 +00002732 struct listnode *node;
jardineb5d44e2003-12-23 08:09:43 +00002733 struct listnode *node2;
2734 struct arc *arc;
hassof1082d12005-09-19 04:23:34 +00002735
paul92c9f222005-05-25 12:21:13 +00002736 for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
hassof1082d12005-09-19 04:23:34 +00002737 {
2738 if (!area->topology)
2739 continue;
2740
2741 vty_out (vty, "Topology for isis area: %s%s", area->area_tag,
2742 VTY_NEWLINE);
2743 vty_out (vty, "From node To node Distance%s", VTY_NEWLINE);
2744
2745 for (ALL_LIST_ELEMENTS_RO (area->topology, node2, arc))
2746 vty_out (vty, "%9ld %11ld %12ld%s", arc->from_node, arc->to_node,
2747 arc->distance, VTY_NEWLINE);
2748 }
jardineb5d44e2003-12-23 08:09:43 +00002749 return CMD_SUCCESS;
2750}
2751
hassof1082d12005-09-19 04:23:34 +00002752/* Base IS for topology generation. */
hassof390d2c2004-09-10 20:48:21 +00002753DEFUN (topology_baseis,
jardineb5d44e2003-12-23 08:09:43 +00002754 topology_baseis_cmd,
2755 "topology base-is WORD",
hassof1082d12005-09-19 04:23:34 +00002756 "Topology generation for IS-IS\n"
2757 "A Network IS Base for this topology\n"
2758 "XXXX.XXXX.XXXX Network entity title (NET)\n")
jardineb5d44e2003-12-23 08:09:43 +00002759{
2760 struct isis_area *area;
2761 u_char buff[ISIS_SYS_ID_LEN];
2762
2763 area = vty->index;
2764 assert (area);
2765
hassof390d2c2004-09-10 20:48:21 +00002766 if (sysid2buff (buff, argv[0]))
hassof1082d12005-09-19 04:23:34 +00002767 sysid2buff (area->topology_baseis, argv[0]);
hassof390d2c2004-09-10 20:48:21 +00002768
jardineb5d44e2003-12-23 08:09:43 +00002769 return CMD_SUCCESS;
2770}
2771
jardineb5d44e2003-12-23 08:09:43 +00002772DEFUN (no_topology_baseis,
2773 no_topology_baseis_cmd,
2774 "no topology base-is WORD",
2775 NO_STR
hassof1082d12005-09-19 04:23:34 +00002776 "Topology generation for IS-IS\n"
2777 "A Network IS Base for this topology\n"
2778 "XXXX.XXXX.XXXX Network entity title (NET)\n")
jardineb5d44e2003-12-23 08:09:43 +00002779{
2780 struct isis_area *area;
2781
2782 area = vty->index;
2783 assert (area);
2784
hassof390d2c2004-09-10 20:48:21 +00002785 memcpy (area->topology_baseis, DEFAULT_TOPOLOGY_BASEIS, ISIS_SYS_ID_LEN);
jardineb5d44e2003-12-23 08:09:43 +00002786 return CMD_SUCCESS;
2787}
2788
hassof1082d12005-09-19 04:23:34 +00002789ALIAS (no_topology_baseis,
2790 no_topology_baseis_noid_cmd,
2791 "no topology base-is",
2792 NO_STR
2793 "Topology generation for IS-IS\n"
2794 "A Network IS Base for this topology\n")
2795
2796DEFUN (topology_basedynh,
2797 topology_basedynh_cmd,
2798 "topology base-dynh WORD",
2799 "Topology generation for IS-IS\n"
2800 "Dynamic hostname base for this topology\n"
2801 "Dynamic hostname base\n")
2802{
2803 struct isis_area *area;
2804
2805 area = vty->index;
2806 assert (area);
2807
2808 /* I hope that it's enough. */
2809 area->topology_basedynh = strndup (argv[0], 16);
2810 return CMD_SUCCESS;
2811}
Josh Bailey3f045a02012-03-24 08:35:20 -07002812
jardineb5d44e2003-12-23 08:09:43 +00002813#endif /* TOPOLOGY_GENERATE */
2814
jardineb5d44e2003-12-23 08:09:43 +00002815/* IS-IS configuration write function */
2816int
2817isis_config_write (struct vty *vty)
2818{
2819 int write = 0;
jardineb5d44e2003-12-23 08:09:43 +00002820
hassof390d2c2004-09-10 20:48:21 +00002821 if (isis != NULL)
2822 {
2823 struct isis_area *area;
hasso3fdb2dd2005-09-28 18:45:54 +00002824 struct listnode *node, *node2;
jardineb5d44e2003-12-23 08:09:43 +00002825
hasso3fdb2dd2005-09-28 18:45:54 +00002826 for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
hassof390d2c2004-09-10 20:48:21 +00002827 {
2828 /* ISIS - Area name */
2829 vty_out (vty, "router isis %s%s", area->area_tag, VTY_NEWLINE);
2830 write++;
2831 /* ISIS - Net */
2832 if (listcount (area->area_addrs) > 0)
2833 {
2834 struct area_addr *area_addr;
hasso3fdb2dd2005-09-28 18:45:54 +00002835 for (ALL_LIST_ELEMENTS_RO (area->area_addrs, node2, area_addr))
2836 {
2837 vty_out (vty, " net %s%s",
2838 isonet_print (area_addr->area_addr,
2839 area_addr->addr_len + ISIS_SYS_ID_LEN +
2840 1), VTY_NEWLINE);
2841 write++;
2842 }
hassof390d2c2004-09-10 20:48:21 +00002843 }
hasso3fdb2dd2005-09-28 18:45:54 +00002844 /* ISIS - Dynamic hostname - Defaults to true so only display if
2845 * false. */
hassof390d2c2004-09-10 20:48:21 +00002846 if (!area->dynhostname)
2847 {
2848 vty_out (vty, " no hostname dynamic%s", VTY_NEWLINE);
2849 write++;
2850 }
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002851 /* ISIS - Metric-Style - when true displays wide */
2852 if (area->newmetric)
hassof390d2c2004-09-10 20:48:21 +00002853 {
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002854 if (!area->oldmetric)
2855 vty_out (vty, " metric-style wide%s", VTY_NEWLINE);
hasso2984d262005-09-26 16:49:07 +00002856 else
2857 vty_out (vty, " metric-style transition%s", VTY_NEWLINE);
hassof390d2c2004-09-10 20:48:21 +00002858 write++;
2859 }
Josh Bailey3f045a02012-03-24 08:35:20 -07002860 /* ISIS - overload-bit */
2861 if (area->overload_bit)
2862 {
2863 vty_out (vty, " set-overload-bit%s", VTY_NEWLINE);
2864 write++;
2865 }
hassof390d2c2004-09-10 20:48:21 +00002866 /* ISIS - Area is-type (level-1-2 is default) */
2867 if (area->is_type == IS_LEVEL_1)
2868 {
2869 vty_out (vty, " is-type level-1%s", VTY_NEWLINE);
2870 write++;
2871 }
Josh Bailey3f045a02012-03-24 08:35:20 -07002872 else if (area->is_type == IS_LEVEL_2)
hassof390d2c2004-09-10 20:48:21 +00002873 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002874 vty_out (vty, " is-type level-2-only%s", VTY_NEWLINE);
2875 write++;
hassof390d2c2004-09-10 20:48:21 +00002876 }
2877 /* ISIS - Lsp generation interval */
2878 if (area->lsp_gen_interval[0] == area->lsp_gen_interval[1])
2879 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002880 if (area->lsp_gen_interval[0] != DEFAULT_MIN_LSP_GEN_INTERVAL)
hassof390d2c2004-09-10 20:48:21 +00002881 {
2882 vty_out (vty, " lsp-gen-interval %d%s",
2883 area->lsp_gen_interval[0], VTY_NEWLINE);
2884 write++;
2885 }
2886 }
2887 else
2888 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002889 if (area->lsp_gen_interval[0] != DEFAULT_MIN_LSP_GEN_INTERVAL)
hassof390d2c2004-09-10 20:48:21 +00002890 {
2891 vty_out (vty, " lsp-gen-interval level-1 %d%s",
2892 area->lsp_gen_interval[0], VTY_NEWLINE);
2893 write++;
2894 }
Josh Bailey3f045a02012-03-24 08:35:20 -07002895 if (area->lsp_gen_interval[1] != DEFAULT_MIN_LSP_GEN_INTERVAL)
hassof390d2c2004-09-10 20:48:21 +00002896 {
2897 vty_out (vty, " lsp-gen-interval level-2 %d%s",
2898 area->lsp_gen_interval[1], VTY_NEWLINE);
2899 write++;
2900 }
2901 }
2902 /* ISIS - LSP lifetime */
2903 if (area->max_lsp_lifetime[0] == area->max_lsp_lifetime[1])
2904 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002905 if (area->max_lsp_lifetime[0] != DEFAULT_LSP_LIFETIME)
hassof390d2c2004-09-10 20:48:21 +00002906 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002907 vty_out (vty, " max-lsp-lifetime %u%s", area->max_lsp_lifetime[0],
hassof390d2c2004-09-10 20:48:21 +00002908 VTY_NEWLINE);
2909 write++;
2910 }
2911 }
2912 else
2913 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002914 if (area->max_lsp_lifetime[0] != DEFAULT_LSP_LIFETIME)
hassof390d2c2004-09-10 20:48:21 +00002915 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002916 vty_out (vty, " max-lsp-lifetime level-1 %u%s",
hassof390d2c2004-09-10 20:48:21 +00002917 area->max_lsp_lifetime[0], VTY_NEWLINE);
2918 write++;
2919 }
Josh Bailey3f045a02012-03-24 08:35:20 -07002920 if (area->max_lsp_lifetime[1] != DEFAULT_LSP_LIFETIME)
hassof390d2c2004-09-10 20:48:21 +00002921 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002922 vty_out (vty, " max-lsp-lifetime level-2 %u%s",
hassof390d2c2004-09-10 20:48:21 +00002923 area->max_lsp_lifetime[1], VTY_NEWLINE);
2924 write++;
2925 }
2926 }
Josh Bailey3f045a02012-03-24 08:35:20 -07002927 /* ISIS - LSP refresh interval */
2928 if (area->lsp_refresh[0] == area->lsp_refresh[1])
2929 {
2930 if (area->lsp_refresh[0] != DEFAULT_MAX_LSP_GEN_INTERVAL)
2931 {
2932 vty_out (vty, " lsp-refresh-interval %u%s", area->lsp_refresh[0],
2933 VTY_NEWLINE);
2934 write++;
2935 }
2936 }
2937 else
2938 {
2939 if (area->lsp_refresh[0] != DEFAULT_MAX_LSP_GEN_INTERVAL)
2940 {
2941 vty_out (vty, " lsp-refresh-interval level-1 %u%s",
2942 area->lsp_refresh[0], VTY_NEWLINE);
2943 write++;
2944 }
2945 if (area->lsp_refresh[1] != DEFAULT_MAX_LSP_GEN_INTERVAL)
2946 {
2947 vty_out (vty, " lsp-refresh-interval level-2 %u%s",
2948 area->lsp_refresh[1], VTY_NEWLINE);
2949 write++;
2950 }
2951 }
hasso13fb40a2005-10-01 06:03:04 +00002952 /* Minimum SPF interval. */
2953 if (area->min_spf_interval[0] == area->min_spf_interval[1])
2954 {
2955 if (area->min_spf_interval[0] != MINIMUM_SPF_INTERVAL)
2956 {
2957 vty_out (vty, " spf-interval %d%s",
2958 area->min_spf_interval[0], VTY_NEWLINE);
2959 write++;
2960 }
2961 }
2962 else
2963 {
2964 if (area->min_spf_interval[0] != MINIMUM_SPF_INTERVAL)
2965 {
2966 vty_out (vty, " spf-interval level-1 %d%s",
2967 area->min_spf_interval[0], VTY_NEWLINE);
2968 write++;
2969 }
2970 if (area->min_spf_interval[1] != MINIMUM_SPF_INTERVAL)
2971 {
2972 vty_out (vty, " spf-interval level-2 %d%s",
2973 area->min_spf_interval[1], VTY_NEWLINE);
2974 write++;
2975 }
2976 }
hasso53c997c2004-09-15 16:21:59 +00002977 /* Authentication passwords. */
Josh Bailey3f045a02012-03-24 08:35:20 -07002978 if (area->area_passwd.type == ISIS_PASSWD_TYPE_HMAC_MD5)
hasso53c997c2004-09-15 16:21:59 +00002979 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002980 vty_out(vty, " area-password md5 %s", area->area_passwd.passwd);
hasso1cbc5622005-01-01 10:29:51 +00002981 if (CHECK_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND))
2982 {
2983 vty_out(vty, " authenticate snp ");
2984 if (CHECK_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV))
2985 vty_out(vty, "validate");
2986 else
2987 vty_out(vty, "send-only");
2988 }
2989 vty_out(vty, "%s", VTY_NEWLINE);
hasso53c997c2004-09-15 16:21:59 +00002990 write++;
Josh Bailey3f045a02012-03-24 08:35:20 -07002991 }
2992 else if (area->area_passwd.type == ISIS_PASSWD_TYPE_CLEARTXT)
2993 {
2994 vty_out(vty, " area-password clear %s", area->area_passwd.passwd);
2995 if (CHECK_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND))
2996 {
2997 vty_out(vty, " authenticate snp ");
2998 if (CHECK_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV))
2999 vty_out(vty, "validate");
3000 else
3001 vty_out(vty, "send-only");
3002 }
3003 vty_out(vty, "%s", VTY_NEWLINE);
3004 write++;
3005 }
3006 if (area->domain_passwd.type == ISIS_PASSWD_TYPE_HMAC_MD5)
hasso53c997c2004-09-15 16:21:59 +00003007 {
Josh Bailey3f045a02012-03-24 08:35:20 -07003008 vty_out(vty, " domain-password md5 %s",
3009 area->domain_passwd.passwd);
3010 if (CHECK_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND))
3011 {
3012 vty_out(vty, " authenticate snp ");
3013 if (CHECK_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV))
3014 vty_out(vty, "validate");
3015 else
3016 vty_out(vty, "send-only");
3017 }
3018 vty_out(vty, "%s", VTY_NEWLINE);
3019 write++;
3020 }
3021 else if (area->domain_passwd.type == ISIS_PASSWD_TYPE_CLEARTXT)
3022 {
3023 vty_out(vty, " domain-password clear %s",
3024 area->domain_passwd.passwd);
hasso1cbc5622005-01-01 10:29:51 +00003025 if (CHECK_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND))
3026 {
3027 vty_out(vty, " authenticate snp ");
3028 if (CHECK_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV))
3029 vty_out(vty, "validate");
3030 else
3031 vty_out(vty, "send-only");
3032 }
3033 vty_out(vty, "%s", VTY_NEWLINE);
hasso53c997c2004-09-15 16:21:59 +00003034 write++;
3035 }
hassof1082d12005-09-19 04:23:34 +00003036
Josh Bailey3f045a02012-03-24 08:35:20 -07003037 if (area->log_adj_changes)
3038 {
3039 vty_out (vty, " log-adjacency-changes%s", VTY_NEWLINE);
3040 write++;
3041 }
3042
hassof390d2c2004-09-10 20:48:21 +00003043#ifdef TOPOLOGY_GENERATE
hassof1082d12005-09-19 04:23:34 +00003044 if (memcmp (area->topology_baseis, DEFAULT_TOPOLOGY_BASEIS,
3045 ISIS_SYS_ID_LEN))
3046 {
3047 vty_out (vty, " topology base-is %s%s",
Josh Bailey3f045a02012-03-24 08:35:20 -07003048 sysid_print ((u_char *)area->topology_baseis), VTY_NEWLINE);
hassof1082d12005-09-19 04:23:34 +00003049 write++;
3050 }
3051 if (area->topology_basedynh)
3052 {
3053 vty_out (vty, " topology base-dynh %s%s",
3054 area->topology_basedynh, VTY_NEWLINE);
3055 write++;
3056 }
3057 /* We save the whole command line here. */
3058 if (strlen(area->top_params))
hassof390d2c2004-09-10 20:48:21 +00003059 {
3060 vty_out (vty, " %s%s", area->top_params, VTY_NEWLINE);
3061 write++;
3062 }
hassof390d2c2004-09-10 20:48:21 +00003063#endif /* TOPOLOGY_GENERATE */
hassof1082d12005-09-19 04:23:34 +00003064
hassof390d2c2004-09-10 20:48:21 +00003065 }
jardineb5d44e2003-12-23 08:09:43 +00003066 }
hassof390d2c2004-09-10 20:48:21 +00003067
jardineb5d44e2003-12-23 08:09:43 +00003068 return write;
3069}
3070
Josh Bailey3f045a02012-03-24 08:35:20 -07003071struct cmd_node isis_node = {
jardineb5d44e2003-12-23 08:09:43 +00003072 ISIS_NODE,
hasso2097cd82003-12-23 11:51:08 +00003073 "%s(config-router)# ",
jardineb5d44e2003-12-23 08:09:43 +00003074 1
3075};
3076
hassof390d2c2004-09-10 20:48:21 +00003077void
jardineb5d44e2003-12-23 08:09:43 +00003078isis_init ()
3079{
jardineb5d44e2003-12-23 08:09:43 +00003080 /* Install IS-IS top node */
3081 install_node (&isis_node, isis_config_write);
hassof390d2c2004-09-10 20:48:21 +00003082
Josh Bailey3f045a02012-03-24 08:35:20 -07003083 install_element (VIEW_NODE, &show_isis_summary_cmd);
3084
3085 install_element (VIEW_NODE, &show_isis_interface_cmd);
3086 install_element (VIEW_NODE, &show_isis_interface_detail_cmd);
3087 install_element (VIEW_NODE, &show_isis_interface_arg_cmd);
3088
3089 install_element (VIEW_NODE, &show_isis_neighbor_cmd);
3090 install_element (VIEW_NODE, &show_isis_neighbor_detail_cmd);
3091 install_element (VIEW_NODE, &show_isis_neighbor_arg_cmd);
3092 install_element (VIEW_NODE, &clear_isis_neighbor_cmd);
3093 install_element (VIEW_NODE, &clear_isis_neighbor_arg_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003094
3095 install_element (VIEW_NODE, &show_hostname_cmd);
3096 install_element (VIEW_NODE, &show_database_cmd);
Josh Bailey3f045a02012-03-24 08:35:20 -07003097 install_element (VIEW_NODE, &show_database_arg_cmd);
3098 install_element (VIEW_NODE, &show_database_arg_detail_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003099 install_element (VIEW_NODE, &show_database_detail_cmd);
Josh Bailey3f045a02012-03-24 08:35:20 -07003100 install_element (VIEW_NODE, &show_database_detail_arg_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003101
Josh Bailey3f045a02012-03-24 08:35:20 -07003102 install_element (ENABLE_NODE, &show_isis_summary_cmd);
3103
3104 install_element (ENABLE_NODE, &show_isis_interface_cmd);
3105 install_element (ENABLE_NODE, &show_isis_interface_detail_cmd);
3106 install_element (ENABLE_NODE, &show_isis_interface_arg_cmd);
3107
3108 install_element (ENABLE_NODE, &show_isis_neighbor_cmd);
3109 install_element (ENABLE_NODE, &show_isis_neighbor_detail_cmd);
3110 install_element (ENABLE_NODE, &show_isis_neighbor_arg_cmd);
3111 install_element (ENABLE_NODE, &clear_isis_neighbor_cmd);
3112 install_element (ENABLE_NODE, &clear_isis_neighbor_arg_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003113
3114 install_element (ENABLE_NODE, &show_hostname_cmd);
3115 install_element (ENABLE_NODE, &show_database_cmd);
Josh Bailey3f045a02012-03-24 08:35:20 -07003116 install_element (ENABLE_NODE, &show_database_arg_cmd);
3117 install_element (ENABLE_NODE, &show_database_arg_detail_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003118 install_element (ENABLE_NODE, &show_database_detail_cmd);
Josh Bailey3f045a02012-03-24 08:35:20 -07003119 install_element (ENABLE_NODE, &show_database_detail_arg_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003120 install_element (ENABLE_NODE, &show_debugging_cmd);
3121
hassof390d2c2004-09-10 20:48:21 +00003122 install_node (&debug_node, config_write_debug);
jardin9e867fe2003-12-23 08:56:18 +00003123
jardineb5d44e2003-12-23 08:09:43 +00003124 install_element (ENABLE_NODE, &debug_isis_adj_cmd);
3125 install_element (ENABLE_NODE, &no_debug_isis_adj_cmd);
3126 install_element (ENABLE_NODE, &debug_isis_csum_cmd);
3127 install_element (ENABLE_NODE, &no_debug_isis_csum_cmd);
3128 install_element (ENABLE_NODE, &debug_isis_lupd_cmd);
3129 install_element (ENABLE_NODE, &no_debug_isis_lupd_cmd);
3130 install_element (ENABLE_NODE, &debug_isis_err_cmd);
3131 install_element (ENABLE_NODE, &no_debug_isis_err_cmd);
3132 install_element (ENABLE_NODE, &debug_isis_snp_cmd);
3133 install_element (ENABLE_NODE, &no_debug_isis_snp_cmd);
3134 install_element (ENABLE_NODE, &debug_isis_upd_cmd);
3135 install_element (ENABLE_NODE, &no_debug_isis_upd_cmd);
3136 install_element (ENABLE_NODE, &debug_isis_spfevents_cmd);
3137 install_element (ENABLE_NODE, &no_debug_isis_spfevents_cmd);
3138 install_element (ENABLE_NODE, &debug_isis_spfstats_cmd);
3139 install_element (ENABLE_NODE, &no_debug_isis_spfstats_cmd);
3140 install_element (ENABLE_NODE, &debug_isis_spftrigg_cmd);
3141 install_element (ENABLE_NODE, &no_debug_isis_spftrigg_cmd);
3142 install_element (ENABLE_NODE, &debug_isis_rtevents_cmd);
3143 install_element (ENABLE_NODE, &no_debug_isis_rtevents_cmd);
3144 install_element (ENABLE_NODE, &debug_isis_events_cmd);
3145 install_element (ENABLE_NODE, &no_debug_isis_events_cmd);
Josh Bailey3f045a02012-03-24 08:35:20 -07003146 install_element (ENABLE_NODE, &debug_isis_packet_dump_cmd);
3147 install_element (ENABLE_NODE, &no_debug_isis_packet_dump_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003148
jardin9e867fe2003-12-23 08:56:18 +00003149 install_element (CONFIG_NODE, &debug_isis_adj_cmd);
3150 install_element (CONFIG_NODE, &no_debug_isis_adj_cmd);
3151 install_element (CONFIG_NODE, &debug_isis_csum_cmd);
3152 install_element (CONFIG_NODE, &no_debug_isis_csum_cmd);
3153 install_element (CONFIG_NODE, &debug_isis_lupd_cmd);
3154 install_element (CONFIG_NODE, &no_debug_isis_lupd_cmd);
3155 install_element (CONFIG_NODE, &debug_isis_err_cmd);
3156 install_element (CONFIG_NODE, &no_debug_isis_err_cmd);
3157 install_element (CONFIG_NODE, &debug_isis_snp_cmd);
3158 install_element (CONFIG_NODE, &no_debug_isis_snp_cmd);
3159 install_element (CONFIG_NODE, &debug_isis_upd_cmd);
3160 install_element (CONFIG_NODE, &no_debug_isis_upd_cmd);
3161 install_element (CONFIG_NODE, &debug_isis_spfevents_cmd);
3162 install_element (CONFIG_NODE, &no_debug_isis_spfevents_cmd);
3163 install_element (CONFIG_NODE, &debug_isis_spfstats_cmd);
3164 install_element (CONFIG_NODE, &no_debug_isis_spfstats_cmd);
3165 install_element (CONFIG_NODE, &debug_isis_spftrigg_cmd);
3166 install_element (CONFIG_NODE, &no_debug_isis_spftrigg_cmd);
3167 install_element (CONFIG_NODE, &debug_isis_rtevents_cmd);
3168 install_element (CONFIG_NODE, &no_debug_isis_rtevents_cmd);
3169 install_element (CONFIG_NODE, &debug_isis_events_cmd);
3170 install_element (CONFIG_NODE, &no_debug_isis_events_cmd);
Josh Bailey3f045a02012-03-24 08:35:20 -07003171 install_element (CONFIG_NODE, &debug_isis_packet_dump_cmd);
3172 install_element (CONFIG_NODE, &no_debug_isis_packet_dump_cmd);
jardin9e867fe2003-12-23 08:56:18 +00003173
jardineb5d44e2003-12-23 08:09:43 +00003174 install_element (CONFIG_NODE, &router_isis_cmd);
3175 install_element (CONFIG_NODE, &no_router_isis_cmd);
3176
3177 install_default (ISIS_NODE);
3178
3179 install_element (ISIS_NODE, &net_cmd);
3180 install_element (ISIS_NODE, &no_net_cmd);
3181
3182 install_element (ISIS_NODE, &is_type_cmd);
3183 install_element (ISIS_NODE, &no_is_type_cmd);
3184
Josh Bailey3f045a02012-03-24 08:35:20 -07003185 install_element (ISIS_NODE, &area_passwd_md5_cmd);
3186 install_element (ISIS_NODE, &area_passwd_md5_snpauth_cmd);
3187 install_element (ISIS_NODE, &area_passwd_clear_cmd);
3188 install_element (ISIS_NODE, &area_passwd_clear_snpauth_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003189 install_element (ISIS_NODE, &no_area_passwd_cmd);
3190
Josh Bailey3f045a02012-03-24 08:35:20 -07003191 install_element (ISIS_NODE, &domain_passwd_md5_cmd);
3192 install_element (ISIS_NODE, &domain_passwd_md5_snpauth_cmd);
3193 install_element (ISIS_NODE, &domain_passwd_clear_cmd);
3194 install_element (ISIS_NODE, &domain_passwd_clear_snpauth_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003195 install_element (ISIS_NODE, &no_domain_passwd_cmd);
3196
3197 install_element (ISIS_NODE, &lsp_gen_interval_cmd);
3198 install_element (ISIS_NODE, &no_lsp_gen_interval_cmd);
3199 install_element (ISIS_NODE, &no_lsp_gen_interval_arg_cmd);
3200 install_element (ISIS_NODE, &lsp_gen_interval_l1_cmd);
3201 install_element (ISIS_NODE, &no_lsp_gen_interval_l1_cmd);
3202 install_element (ISIS_NODE, &no_lsp_gen_interval_l1_arg_cmd);
3203 install_element (ISIS_NODE, &lsp_gen_interval_l2_cmd);
3204 install_element (ISIS_NODE, &no_lsp_gen_interval_l2_cmd);
3205 install_element (ISIS_NODE, &no_lsp_gen_interval_l2_arg_cmd);
3206
3207 install_element (ISIS_NODE, &spf_interval_cmd);
3208 install_element (ISIS_NODE, &no_spf_interval_cmd);
3209 install_element (ISIS_NODE, &no_spf_interval_arg_cmd);
3210 install_element (ISIS_NODE, &spf_interval_l1_cmd);
3211 install_element (ISIS_NODE, &no_spf_interval_l1_cmd);
3212 install_element (ISIS_NODE, &no_spf_interval_l1_arg_cmd);
3213 install_element (ISIS_NODE, &spf_interval_l2_cmd);
3214 install_element (ISIS_NODE, &no_spf_interval_l2_cmd);
3215 install_element (ISIS_NODE, &no_spf_interval_l2_arg_cmd);
hassof390d2c2004-09-10 20:48:21 +00003216
Josh Bailey3f045a02012-03-24 08:35:20 -07003217 install_element (ISIS_NODE, &max_lsp_lifetime_cmd);
3218 install_element (ISIS_NODE, &no_max_lsp_lifetime_cmd);
3219 install_element (ISIS_NODE, &no_max_lsp_lifetime_arg_cmd);
3220 install_element (ISIS_NODE, &max_lsp_lifetime_l1_cmd);
3221 install_element (ISIS_NODE, &no_max_lsp_lifetime_l1_cmd);
3222 install_element (ISIS_NODE, &no_max_lsp_lifetime_l1_arg_cmd);
3223 install_element (ISIS_NODE, &max_lsp_lifetime_l2_cmd);
3224 install_element (ISIS_NODE, &no_max_lsp_lifetime_l2_cmd);
3225 install_element (ISIS_NODE, &no_max_lsp_lifetime_l2_arg_cmd);
3226
3227 install_element (ISIS_NODE, &lsp_refresh_interval_cmd);
3228 install_element (ISIS_NODE, &no_lsp_refresh_interval_cmd);
3229 install_element (ISIS_NODE, &no_lsp_refresh_interval_arg_cmd);
3230 install_element (ISIS_NODE, &lsp_refresh_interval_l1_cmd);
3231 install_element (ISIS_NODE, &no_lsp_refresh_interval_l1_cmd);
3232 install_element (ISIS_NODE, &no_lsp_refresh_interval_l1_arg_cmd);
3233 install_element (ISIS_NODE, &lsp_refresh_interval_l2_cmd);
3234 install_element (ISIS_NODE, &no_lsp_refresh_interval_l2_cmd);
3235 install_element (ISIS_NODE, &no_lsp_refresh_interval_l2_arg_cmd);
3236
3237 install_element (ISIS_NODE, &set_overload_bit_cmd);
3238 install_element (ISIS_NODE, &no_set_overload_bit_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003239
3240 install_element (ISIS_NODE, &dynamic_hostname_cmd);
3241 install_element (ISIS_NODE, &no_dynamic_hostname_cmd);
3242
3243 install_element (ISIS_NODE, &metric_style_cmd);
3244 install_element (ISIS_NODE, &no_metric_style_cmd);
Josh Bailey3f045a02012-03-24 08:35:20 -07003245
3246 install_element (ISIS_NODE, &log_adj_changes_cmd);
3247 install_element (ISIS_NODE, &no_log_adj_changes_cmd);
3248
jardineb5d44e2003-12-23 08:09:43 +00003249#ifdef TOPOLOGY_GENERATE
3250 install_element (ISIS_NODE, &topology_generate_grid_cmd);
3251 install_element (ISIS_NODE, &topology_baseis_cmd);
hassof1082d12005-09-19 04:23:34 +00003252 install_element (ISIS_NODE, &topology_basedynh_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003253 install_element (ISIS_NODE, &no_topology_baseis_cmd);
hassof1082d12005-09-19 04:23:34 +00003254 install_element (ISIS_NODE, &no_topology_baseis_noid_cmd);
hassof695b012005-04-02 19:03:39 +00003255 install_element (VIEW_NODE, &show_isis_generated_topology_cmd);
3256 install_element (ENABLE_NODE, &show_isis_generated_topology_cmd);
jardineb5d44e2003-12-23 08:09:43 +00003257#endif /* TOPOLOGY_GENERATE */
jardineb5d44e2003-12-23 08:09:43 +00003258}