Annotation of embedaddon/quagga/isisd/isisd.c, revision 1.1.1.2
1.1 misho 1: /*
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:
23: #include <zebra.h>
24:
25: #include "thread.h"
26: #include "vty.h"
27: #include "command.h"
28: #include "log.h"
29: #include "memory.h"
1.1.1.2 ! misho 30: #include "time.h"
1.1 misho 31: #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"
42: #include "isisd/isis_flags.h"
1.1.1.2 ! misho 43: #include "isisd/isis_circuit.h"
! 44: #include "isisd/isis_csm.h"
1.1 misho 45: #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"
60: u_char DEFAULT_TOPOLOGY_BASEIS[6] = { 0xFE, 0xED, 0xFE, 0xED, 0x00, 0x00 };
61: #endif /* TOPOLOGY_GENERATE */
62:
63: struct isis *isis = NULL;
64:
65: /*
66: * Prototypes.
67: */
68: int isis_area_get(struct vty *, const char *);
69: int isis_area_destroy(struct vty *, const char *);
1.1.1.2 ! misho 70: int area_net_title(struct vty *, const char *);
! 71: int area_clear_net_title(struct vty *, const char *);
! 72: int show_isis_interface_common(struct vty *, const char *ifname, char);
! 73: int show_isis_neighbor_common(struct vty *, const char *id, char);
! 74: int clear_isis_neighbor_common(struct vty *, const char *id);
1.1 misho 75: int isis_config_write(struct vty *);
76:
77:
78:
79: void
80: isis_new (unsigned long process_id)
81: {
82: isis = XCALLOC (MTYPE_ISIS, sizeof (struct isis));
83: /*
84: * Default values
85: */
86: isis->max_area_addrs = 3;
87: isis->process_id = process_id;
1.1.1.2 ! misho 88: isis->router_id = 0;
1.1 misho 89: 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 */
1.1.1.2 ! misho 96: dyn_cache_init ();
1.1 misho 97: /*
98: * uncomment the next line for full debugs
99: */
100: /* isis->debugs = 0xFFFF; */
101: }
102:
103: struct isis_area *
1.1.1.2 ! misho 104: isis_area_create (const char *area_tag)
1.1 misho 105: {
106: struct isis_area *area;
107:
108: area = XCALLOC (MTYPE_ISIS_AREA, sizeof (struct isis_area));
109:
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;
1.1.1.2 ! misho 118:
1.1 misho 119: /*
120: * intialize the databases
121: */
1.1.1.2 ! misho 122: 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 ();
1.1 misho 134: #ifdef HAVE_IPV6
1.1.1.2 ! misho 135: area->route_table6[1] = route_table_init ();
1.1 misho 136: #endif /* HAVE_IPV6 */
1.1.1.2 ! misho 137: }
! 138:
! 139: spftree_area_init (area);
! 140:
1.1 misho 141: area->circuit_list = list_new ();
142: area->area_addrs = list_new ();
143: THREAD_TIMER_ON (master, area->t_tick, lsp_tick, area, 1);
144: flags_initialize (&area->flags);
1.1.1.2 ! misho 145:
1.1 misho 146: /*
147: * Default values
148: */
1.1.1.2 ! misho 149: 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;
1.1 misho 155: area->min_spf_interval[0] = MINIMUM_SPF_INTERVAL;
156: area->min_spf_interval[1] = MINIMUM_SPF_INTERVAL;
157: area->dynhostname = 1;
1.1.1.2 ! misho 158: area->oldmetric = 0;
! 159: area->newmetric = 1;
1.1 misho 160: 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:
1.1.1.2 ! misho 168: area->area_tag = strdup (area_tag);
! 169: listnode_add (isis->area_list, area);
! 170: area->isis = isis;
! 171:
1.1 misho 172: return area;
173: }
174:
175: struct isis_area *
176: isis_area_lookup (const char *area_tag)
177: {
178: struct isis_area *area;
179: struct listnode *node;
180:
181: for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
182: if ((area->area_tag == NULL && area_tag == NULL) ||
183: (area->area_tag && area_tag
184: && strcmp (area->area_tag, area_tag) == 0))
185: return area;
186:
187: return NULL;
188: }
189:
190: int
191: isis_area_get (struct vty *vty, const char *area_tag)
192: {
193: struct isis_area *area;
194:
195: area = isis_area_lookup (area_tag);
196:
197: if (area)
198: {
199: vty->node = ISIS_NODE;
200: vty->index = area;
201: return CMD_SUCCESS;
202: }
203:
1.1.1.2 ! misho 204: area = isis_area_create (area_tag);
1.1 misho 205:
206: if (isis->debugs & DEBUG_EVENTS)
207: zlog_debug ("New IS-IS area instance %s", area->area_tag);
208:
209: vty->node = ISIS_NODE;
210: vty->index = area;
211:
212: return CMD_SUCCESS;
213: }
214:
215: int
216: isis_area_destroy (struct vty *vty, const char *area_tag)
217: {
218: struct isis_area *area;
219: struct listnode *node, *nnode;
220: struct isis_circuit *circuit;
1.1.1.2 ! misho 221: struct area_addr *addr;
1.1 misho 222:
223: area = isis_area_lookup (area_tag);
224:
225: if (area == NULL)
226: {
227: vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE);
1.1.1.2 ! misho 228: return CMD_ERR_NO_MATCH;
1.1 misho 229: }
230:
231: if (area->circuit_list)
232: {
233: for (ALL_LIST_ELEMENTS (area->circuit_list, node, nnode, circuit))
1.1.1.2 ! misho 234: {
! 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: }
1.1 misho 241: list_delete (area->circuit_list);
1.1.1.2 ! misho 242: area->circuit_list = NULL;
1.1 misho 243: }
1.1.1.2 ! misho 244:
! 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;
1.1 misho 291:
292: THREAD_TIMER_OFF (area->t_tick);
293: THREAD_TIMER_OFF (area->t_lsp_refresh[0]);
294: THREAD_TIMER_OFF (area->t_lsp_refresh[1]);
295:
1.1.1.2 ! misho 296: thread_cancel_event (master, area);
! 297:
! 298: listnode_delete (isis->area_list, area);
1.1 misho 299:
1.1.1.2 ! misho 300: free (area->area_tag);
1.1 misho 301:
302: XFREE (MTYPE_ISIS_AREA, area);
303:
1.1.1.2 ! misho 304: if (listcount (isis->area_list) == 0)
! 305: {
! 306: memset (isis->sysid, 0, ISIS_SYS_ID_LEN);
! 307: isis->sysid_set = 0;
! 308: }
1.1 misho 309:
310: return CMD_SUCCESS;
311: }
312:
313: int
1.1.1.2 ! misho 314: area_net_title (struct vty *vty, const char *net_title)
1.1 misho 315: {
316: struct isis_area *area;
317: struct area_addr *addr;
318: struct area_addr *addrp;
319: struct listnode *node;
320:
321: u_char buff[255];
322: area = vty->index;
323:
324: if (!area)
325: {
326: vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE);
1.1.1.2 ! misho 327: return CMD_ERR_NO_MATCH;
1.1 misho 328: }
329:
330: /* We check that we are not over the maximal number of addresses */
331: 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);
1.1.1.2 ! misho 335: return CMD_ERR_NOTHING_TODO;
1.1 misho 336: }
337:
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
342: zlog_debug ("added area address %s for area %s (address length %d)",
343: net_title, area->area_tag, addr->addr_len);
344: #endif /* EXTREME_DEBUG */
345: if (addr->addr_len < 8 || addr->addr_len > 20)
346: {
1.1.1.2 ! misho 347: vty_out (vty, "area address must be at least 8..20 octets long (%d)%s",
! 348: addr->addr_len, VTY_NEWLINE);
! 349: XFREE (MTYPE_ISIS_AREA_ADDR, addr);
! 350: 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);
1.1 misho 357: XFREE (MTYPE_ISIS_AREA_ADDR, addr);
1.1.1.2 ! misho 358: return CMD_ERR_AMBIGUOUS;
1.1 misho 359: }
360:
361: if (isis->sysid_set == 0)
362: {
363: /*
364: * First area address - get the SystemID for this router
365: */
1.1.1.2 ! misho 366: memcpy (isis->sysid, GETSYSID (addr), ISIS_SYS_ID_LEN);
1.1 misho 367: isis->sysid_set = 1;
368: if (isis->debugs & DEBUG_EVENTS)
369: zlog_debug ("Router has SystemID %s", sysid_print (isis->sysid));
370: }
371: else
372: {
373: /*
374: * Check that the SystemID portions match
375: */
1.1.1.2 ! misho 376: if (memcmp (isis->sysid, GETSYSID (addr), ISIS_SYS_ID_LEN))
1.1 misho 377: {
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);
1.1.1.2 ! misho 382: return CMD_ERR_AMBIGUOUS;
1.1 misho 383: }
384:
385: /* now we see that we don't already have this address */
386: for (ALL_LIST_ELEMENTS_RO (area->area_addrs, node, addrp))
387: {
1.1.1.2 ! misho 388: if ((addrp->addr_len + ISIS_SYS_ID_LEN + ISIS_NSEL_LEN) != (addr->addr_len))
1.1 misho 389: 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: }
396: }
1.1.1.2 ! misho 397:
1.1 misho 398: /*
399: * Forget the systemID part of the address
400: */
1.1.1.2 ! misho 401: addr->addr_len -= (ISIS_SYS_ID_LEN + ISIS_NSEL_LEN);
1.1 misho 402: listnode_add (area->area_addrs, addr);
403:
404: /* only now we can safely generate our LSPs for this area */
405: if (listcount (area->area_addrs) > 0)
406: {
1.1.1.2 ! misho 407: 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);
1.1 misho 411: }
412:
413: return CMD_SUCCESS;
414: }
415:
416: int
1.1.1.2 ! misho 417: area_clear_net_title (struct vty *vty, const char *net_title)
1.1 misho 418: {
419: struct isis_area *area;
420: struct area_addr addr, *addrp = NULL;
421: struct listnode *node;
422: u_char buff[255];
423:
424: area = vty->index;
425: if (!area)
426: {
427: vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE);
1.1.1.2 ! misho 428: return CMD_ERR_NO_MATCH;
1.1 misho 429: }
430:
431: addr.addr_len = dotformat2buff (buff, net_title);
432: 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);
1.1.1.2 ! misho 436: return CMD_ERR_AMBIGUOUS;
1.1 misho 437: }
438:
439: memcpy (addr.area_addr, buff, (int) addr.addr_len);
440:
441: for (ALL_LIST_ELEMENTS_RO (area->area_addrs, node, addrp))
1.1.1.2 ! misho 442: if ((addrp->addr_len + ISIS_SYS_ID_LEN + 1) == addr.addr_len &&
1.1 misho 443: !memcmp (addrp->area_addr, addr.area_addr, addr.addr_len))
444: 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);
1.1.1.2 ! misho 450: return CMD_ERR_NO_MATCH;
1.1 misho 451: }
452:
453: listnode_delete (area->area_addrs, addrp);
1.1.1.2 ! misho 454: 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: }
1.1 misho 466:
467: return CMD_SUCCESS;
468: }
469:
470: /*
1.1.1.2 ! misho 471: * 'show isis interface' command
1.1 misho 472: */
473:
474: int
1.1.1.2 ! misho 475: show_isis_interface_common (struct vty *vty, const char *ifname, char detail)
1.1 misho 476: {
477: struct listnode *anode, *cnode;
478: struct isis_area *area;
479: struct isis_circuit *circuit;
480:
481: if (!isis)
482: {
483: vty_out (vty, "IS-IS Routing Process not enabled%s", VTY_NEWLINE);
484: return CMD_SUCCESS;
485: }
486:
487: for (ALL_LIST_ELEMENTS_RO (isis->area_list, anode, area))
488: {
489: vty_out (vty, "Area %s:%s", area->area_tag, VTY_NEWLINE);
490:
491: if (detail == ISIS_UI_LEVEL_BRIEF)
1.1.1.2 ! misho 492: vty_out (vty, " Interface CircId State Type Level%s",
! 493: VTY_NEWLINE);
1.1 misho 494:
495: for (ALL_LIST_ELEMENTS_RO (area->circuit_list, cnode, circuit))
1.1.1.2 ! misho 496: 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);
1.1 misho 500: }
501:
502: return CMD_SUCCESS;
503: }
504:
1.1.1.2 ! misho 505: DEFUN (show_isis_interface,
! 506: show_isis_interface_cmd,
! 507: "show isis interface",
1.1 misho 508: SHOW_STR
1.1.1.2 ! misho 509: "ISIS network information\n"
! 510: "ISIS interface\n")
1.1 misho 511: {
1.1.1.2 ! misho 512: return show_isis_interface_common (vty, NULL, ISIS_UI_LEVEL_BRIEF);
1.1 misho 513: }
514:
1.1.1.2 ! misho 515: DEFUN (show_isis_interface_detail,
! 516: show_isis_interface_detail_cmd,
! 517: "show isis interface detail",
1.1 misho 518: SHOW_STR
1.1.1.2 ! misho 519: "ISIS network information\n"
! 520: "ISIS interface\n"
! 521: "show detailed information\n")
! 522: {
! 523: return show_isis_interface_common (vty, NULL, ISIS_UI_LEVEL_DETAIL);
! 524: }
1.1 misho 525:
1.1.1.2 ! misho 526: DEFUN (show_isis_interface_arg,
! 527: show_isis_interface_arg_cmd,
! 528: "show isis interface WORD",
1.1 misho 529: SHOW_STR
1.1.1.2 ! misho 530: "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:
! 541: int
! 542: show_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: */
! 614: int
! 615: clear_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:
! 679: DEFUN (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")
1.1 misho 685: {
1.1.1.2 ! misho 686: return show_isis_neighbor_common (vty, NULL, ISIS_UI_LEVEL_BRIEF);
1.1 misho 687: }
688:
1.1.1.2 ! misho 689: DEFUN (show_isis_neighbor_detail,
! 690: show_isis_neighbor_detail_cmd,
! 691: "show isis neighbor detail",
1.1 misho 692: SHOW_STR
1.1.1.2 ! misho 693: "ISIS network information\n"
! 694: "ISIS neighbor adjacencies\n"
1.1 misho 695: "show detailed information\n")
1.1.1.2 ! misho 696: {
! 697: return show_isis_neighbor_common (vty, NULL, ISIS_UI_LEVEL_DETAIL);
! 698: }
! 699:
! 700: DEFUN (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:
! 711: DEFUN (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:
! 721: DEFUN (clear_isis_neighbor_arg,
! 722: clear_isis_neighbor_arg_cmd,
! 723: "clear isis neighbor WORD",
! 724: 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:
1.1 misho 732: /*
733: * 'isis debug', 'show debugging'
734: */
735: void
736: print_debug (struct vty *vty, int flags, int onoff)
737: {
738: char onoffs[4];
739: if (onoff)
740: strcpy (onoffs, "on");
741: else
742: strcpy (onoffs, "off");
743:
744: if (flags & DEBUG_ADJ_PACKETS)
745: vty_out (vty, "IS-IS Adjacency related packets debugging is %s%s", onoffs,
746: VTY_NEWLINE);
747: if (flags & DEBUG_CHECKSUM_ERRORS)
748: vty_out (vty, "IS-IS checksum errors debugging is %s%s", onoffs,
749: VTY_NEWLINE);
750: if (flags & DEBUG_LOCAL_UPDATES)
751: vty_out (vty, "IS-IS local updates debugging is %s%s", onoffs,
752: VTY_NEWLINE);
753: if (flags & DEBUG_PROTOCOL_ERRORS)
754: vty_out (vty, "IS-IS protocol errors debugging is %s%s", onoffs,
755: VTY_NEWLINE);
756: if (flags & DEBUG_SNP_PACKETS)
757: vty_out (vty, "IS-IS CSNP/PSNP packets debugging is %s%s", onoffs,
758: VTY_NEWLINE);
759: if (flags & DEBUG_SPF_EVENTS)
760: vty_out (vty, "IS-IS SPF events debugging is %s%s", onoffs, VTY_NEWLINE);
761: if (flags & DEBUG_SPF_STATS)
762: vty_out (vty, "IS-IS SPF Timing and Statistics Data debugging is %s%s",
763: onoffs, VTY_NEWLINE);
764: if (flags & DEBUG_SPF_TRIGGERS)
765: vty_out (vty, "IS-IS SPF triggering events debugging is %s%s", onoffs,
766: VTY_NEWLINE);
767: if (flags & DEBUG_UPDATE_PACKETS)
768: vty_out (vty, "IS-IS Update related packet debugging is %s%s", onoffs,
769: VTY_NEWLINE);
770: if (flags & DEBUG_RTE_EVENTS)
771: vty_out (vty, "IS-IS Route related debuggin is %s%s", onoffs,
772: VTY_NEWLINE);
773: if (flags & DEBUG_EVENTS)
774: vty_out (vty, "IS-IS Event debugging is %s%s", onoffs, VTY_NEWLINE);
1.1.1.2 ! misho 775: if (flags & DEBUG_PACKET_DUMP)
! 776: vty_out (vty, "IS-IS Packet dump debugging is %s%s", onoffs, VTY_NEWLINE);
1.1 misho 777: }
778:
779: DEFUN (show_debugging,
780: show_debugging_cmd,
781: "show debugging",
782: SHOW_STR
783: "State of each debugging option\n")
784: {
785: vty_out (vty, "IS-IS:%s", VTY_NEWLINE);
786: print_debug (vty, isis->debugs, 1);
787: return CMD_SUCCESS;
788: }
789:
790: /* Debug node. */
791: static struct cmd_node debug_node = {
792: DEBUG_NODE,
793: "",
794: 1
795: };
796:
797: static int
798: config_write_debug (struct vty *vty)
799: {
800: int write = 0;
801: int flags = isis->debugs;
802:
803: 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: }
1.1.1.2 ! misho 858: if (flags & DEBUG_PACKET_DUMP)
! 859: {
! 860: vty_out (vty, "debug isis packet-dump%s", VTY_NEWLINE);
! 861: write++;
! 862: }
1.1 misho 863:
864: return write;
865: }
866:
867: DEFUN (debug_isis_adj,
868: debug_isis_adj_cmd,
869: "debug isis adj-packets",
870: DEBUG_STR
871: "IS-IS information\n"
872: "IS-IS Adjacency related packets\n")
873: {
874: isis->debugs |= DEBUG_ADJ_PACKETS;
875: print_debug (vty, DEBUG_ADJ_PACKETS, 1);
876:
877: return CMD_SUCCESS;
878: }
879:
880: DEFUN (no_debug_isis_adj,
881: no_debug_isis_adj_cmd,
882: "no debug isis adj-packets",
883: UNDEBUG_STR
884: "IS-IS information\n"
885: "IS-IS Adjacency related packets\n")
886: {
887: isis->debugs &= ~DEBUG_ADJ_PACKETS;
888: print_debug (vty, DEBUG_ADJ_PACKETS, 0);
889:
890: return CMD_SUCCESS;
891: }
892:
893: DEFUN (debug_isis_csum,
894: debug_isis_csum_cmd,
895: "debug isis checksum-errors",
896: DEBUG_STR
897: "IS-IS information\n"
898: "IS-IS LSP checksum errors\n")
899: {
900: isis->debugs |= DEBUG_CHECKSUM_ERRORS;
901: print_debug (vty, DEBUG_CHECKSUM_ERRORS, 1);
902:
903: return CMD_SUCCESS;
904: }
905:
906: DEFUN (no_debug_isis_csum,
907: no_debug_isis_csum_cmd,
908: "no debug isis checksum-errors",
909: UNDEBUG_STR
910: "IS-IS information\n"
911: "IS-IS LSP checksum errors\n")
912: {
913: isis->debugs &= ~DEBUG_CHECKSUM_ERRORS;
914: print_debug (vty, DEBUG_CHECKSUM_ERRORS, 0);
915:
916: return CMD_SUCCESS;
917: }
918:
919: DEFUN (debug_isis_lupd,
920: debug_isis_lupd_cmd,
921: "debug isis local-updates",
922: DEBUG_STR
923: "IS-IS information\n"
924: "IS-IS local update packets\n")
925: {
926: isis->debugs |= DEBUG_LOCAL_UPDATES;
927: print_debug (vty, DEBUG_LOCAL_UPDATES, 1);
928:
929: return CMD_SUCCESS;
930: }
931:
932: DEFUN (no_debug_isis_lupd,
933: no_debug_isis_lupd_cmd,
934: "no debug isis local-updates",
935: UNDEBUG_STR
936: "IS-IS information\n"
937: "IS-IS local update packets\n")
938: {
939: isis->debugs &= ~DEBUG_LOCAL_UPDATES;
940: print_debug (vty, DEBUG_LOCAL_UPDATES, 0);
941:
942: return CMD_SUCCESS;
943: }
944:
945: DEFUN (debug_isis_err,
946: debug_isis_err_cmd,
947: "debug isis protocol-errors",
948: DEBUG_STR
949: "IS-IS information\n"
950: "IS-IS LSP protocol errors\n")
951: {
952: isis->debugs |= DEBUG_PROTOCOL_ERRORS;
953: print_debug (vty, DEBUG_PROTOCOL_ERRORS, 1);
954:
955: return CMD_SUCCESS;
956: }
957:
958: DEFUN (no_debug_isis_err,
959: no_debug_isis_err_cmd,
960: "no debug isis protocol-errors",
961: UNDEBUG_STR
962: "IS-IS information\n"
963: "IS-IS LSP protocol errors\n")
964: {
965: isis->debugs &= ~DEBUG_PROTOCOL_ERRORS;
966: print_debug (vty, DEBUG_PROTOCOL_ERRORS, 0);
967:
968: return CMD_SUCCESS;
969: }
970:
971: DEFUN (debug_isis_snp,
972: debug_isis_snp_cmd,
973: "debug isis snp-packets",
974: DEBUG_STR
975: "IS-IS information\n"
976: "IS-IS CSNP/PSNP packets\n")
977: {
978: isis->debugs |= DEBUG_SNP_PACKETS;
979: print_debug (vty, DEBUG_SNP_PACKETS, 1);
980:
981: return CMD_SUCCESS;
982: }
983:
984: DEFUN (no_debug_isis_snp,
985: no_debug_isis_snp_cmd,
986: "no debug isis snp-packets",
987: UNDEBUG_STR
988: "IS-IS information\n"
989: "IS-IS CSNP/PSNP packets\n")
990: {
991: isis->debugs &= ~DEBUG_SNP_PACKETS;
992: print_debug (vty, DEBUG_SNP_PACKETS, 0);
993:
994: return CMD_SUCCESS;
995: }
996:
997: DEFUN (debug_isis_upd,
998: debug_isis_upd_cmd,
999: "debug isis update-packets",
1000: DEBUG_STR
1001: "IS-IS information\n"
1002: "IS-IS Update related packets\n")
1003: {
1004: isis->debugs |= DEBUG_UPDATE_PACKETS;
1005: print_debug (vty, DEBUG_UPDATE_PACKETS, 1);
1006:
1007: return CMD_SUCCESS;
1008: }
1009:
1010: DEFUN (no_debug_isis_upd,
1011: no_debug_isis_upd_cmd,
1012: "no debug isis update-packets",
1013: UNDEBUG_STR
1014: "IS-IS information\n"
1015: "IS-IS Update related packets\n")
1016: {
1017: isis->debugs &= ~DEBUG_UPDATE_PACKETS;
1018: print_debug (vty, DEBUG_UPDATE_PACKETS, 0);
1019:
1020: return CMD_SUCCESS;
1021: }
1022:
1023: DEFUN (debug_isis_spfevents,
1024: debug_isis_spfevents_cmd,
1025: "debug isis spf-events",
1026: DEBUG_STR
1027: "IS-IS information\n"
1028: "IS-IS Shortest Path First Events\n")
1029: {
1030: isis->debugs |= DEBUG_SPF_EVENTS;
1031: print_debug (vty, DEBUG_SPF_EVENTS, 1);
1032:
1033: return CMD_SUCCESS;
1034: }
1035:
1036: DEFUN (no_debug_isis_spfevents,
1037: no_debug_isis_spfevents_cmd,
1038: "no debug isis spf-events",
1039: UNDEBUG_STR
1040: "IS-IS information\n"
1041: "IS-IS Shortest Path First Events\n")
1042: {
1043: isis->debugs &= ~DEBUG_SPF_EVENTS;
1044: print_debug (vty, DEBUG_SPF_EVENTS, 0);
1045:
1046: return CMD_SUCCESS;
1047: }
1048:
1049: DEFUN (debug_isis_spfstats,
1050: debug_isis_spfstats_cmd,
1051: "debug isis spf-statistics ",
1052: DEBUG_STR
1053: "IS-IS information\n"
1054: "IS-IS SPF Timing and Statistic Data\n")
1055: {
1056: isis->debugs |= DEBUG_SPF_STATS;
1057: print_debug (vty, DEBUG_SPF_STATS, 1);
1058:
1059: return CMD_SUCCESS;
1060: }
1061:
1062: DEFUN (no_debug_isis_spfstats,
1063: no_debug_isis_spfstats_cmd,
1064: "no debug isis spf-statistics",
1065: UNDEBUG_STR
1066: "IS-IS information\n"
1067: "IS-IS SPF Timing and Statistic Data\n")
1068: {
1069: isis->debugs &= ~DEBUG_SPF_STATS;
1070: print_debug (vty, DEBUG_SPF_STATS, 0);
1071:
1072: return CMD_SUCCESS;
1073: }
1074:
1075: DEFUN (debug_isis_spftrigg,
1076: debug_isis_spftrigg_cmd,
1077: "debug isis spf-triggers",
1078: DEBUG_STR
1079: "IS-IS information\n"
1080: "IS-IS SPF triggering events\n")
1081: {
1082: isis->debugs |= DEBUG_SPF_TRIGGERS;
1083: print_debug (vty, DEBUG_SPF_TRIGGERS, 1);
1084:
1085: return CMD_SUCCESS;
1086: }
1087:
1088: DEFUN (no_debug_isis_spftrigg,
1089: no_debug_isis_spftrigg_cmd,
1090: "no debug isis spf-triggers",
1091: UNDEBUG_STR
1092: "IS-IS information\n"
1093: "IS-IS SPF triggering events\n")
1094: {
1095: isis->debugs &= ~DEBUG_SPF_TRIGGERS;
1096: print_debug (vty, DEBUG_SPF_TRIGGERS, 0);
1097:
1098: return CMD_SUCCESS;
1099: }
1100:
1101: DEFUN (debug_isis_rtevents,
1102: debug_isis_rtevents_cmd,
1103: "debug isis route-events",
1104: DEBUG_STR
1105: "IS-IS information\n"
1106: "IS-IS Route related events\n")
1107: {
1108: isis->debugs |= DEBUG_RTE_EVENTS;
1109: print_debug (vty, DEBUG_RTE_EVENTS, 1);
1110:
1111: return CMD_SUCCESS;
1112: }
1113:
1114: DEFUN (no_debug_isis_rtevents,
1115: no_debug_isis_rtevents_cmd,
1116: "no debug isis route-events",
1117: UNDEBUG_STR
1118: "IS-IS information\n"
1119: "IS-IS Route related events\n")
1120: {
1121: isis->debugs &= ~DEBUG_RTE_EVENTS;
1122: print_debug (vty, DEBUG_RTE_EVENTS, 0);
1123:
1124: return CMD_SUCCESS;
1125: }
1126:
1127: DEFUN (debug_isis_events,
1128: debug_isis_events_cmd,
1129: "debug isis events",
1130: DEBUG_STR
1131: "IS-IS information\n"
1132: "IS-IS Events\n")
1133: {
1134: isis->debugs |= DEBUG_EVENTS;
1135: print_debug (vty, DEBUG_EVENTS, 1);
1136:
1137: return CMD_SUCCESS;
1138: }
1139:
1140: DEFUN (no_debug_isis_events,
1141: no_debug_isis_events_cmd,
1142: "no debug isis events",
1143: UNDEBUG_STR
1144: "IS-IS information\n"
1145: "IS-IS Events\n")
1146: {
1147: isis->debugs &= ~DEBUG_EVENTS;
1148: print_debug (vty, DEBUG_EVENTS, 0);
1149:
1150: return CMD_SUCCESS;
1151: }
1152:
1.1.1.2 ! misho 1153: DEFUN (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:
! 1166: DEFUN (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:
1.1 misho 1179: DEFUN (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);
1187:
1188: return CMD_SUCCESS;
1189: }
1190:
1.1.1.2 ! misho 1191: static void
! 1192: vty_out_timestr(struct vty *vty, time_t uptime)
1.1 misho 1193: {
1.1.1.2 ! misho 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:
! 1214: DEFUN (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;
1.1 misho 1220: struct isis_area *area;
1.1.1.2 ! misho 1221: struct isis_spftree *spftree;
! 1222: int level;
1.1 misho 1223:
1.1.1.2 ! misho 1224: if (isis == NULL)
! 1225: {
! 1226: vty_out (vty, "ISIS is not running%s", VTY_NEWLINE);
1.1 misho 1227: return CMD_SUCCESS;
1.1.1.2 ! misho 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);
1.1 misho 1243:
1244: for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
1.1.1.2 ! misho 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)
1.1 misho 1250: {
1.1.1.2 ! misho 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;
1.1 misho 1265:
1.1.1.2 ! misho 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);
1.1 misho 1272:
1.1.1.2 ! misho 1273: vty_out (vty, " minimum interval : %d%s",
! 1274: area->min_spf_interval[level - 1], VTY_NEWLINE);
! 1275:
! 1276: vty_out (vty, " last run elapsed : ");
! 1277: vty_out_timestr(vty, spftree->last_run_timestamp);
! 1278: vty_out (vty, "%s", VTY_NEWLINE);
! 1279:
! 1280: vty_out (vty, " last run duration : %u usec%s",
! 1281: (u_int32_t)spftree->last_run_duration, VTY_NEWLINE);
! 1282:
! 1283: 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:
! 1296: vty_out (vty, " last run elapsed : ");
! 1297: vty_out_timestr(vty, spftree->last_run_timestamp);
! 1298: vty_out (vty, "%s", VTY_NEWLINE);
! 1299:
! 1300: vty_out (vty, " last run duration : %u msec%s",
! 1301: spftree->last_run_duration, VTY_NEWLINE);
! 1302:
! 1303: vty_out (vty, " run count : %d%s",
! 1304: spftree->runcount, VTY_NEWLINE);
! 1305: #endif
1.1 misho 1306: }
1.1.1.2 ! misho 1307: }
! 1308: vty_out (vty, "%s", VTY_NEWLINE);
1.1 misho 1309:
1310: return CMD_SUCCESS;
1311: }
1312:
1.1.1.2 ! misho 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: */
! 1329: static int
! 1330: show_isis_database (struct vty *vty, const char *argv, int ui_level)
1.1 misho 1331: {
1332: struct listnode *node;
1333: struct isis_area *area;
1.1.1.2 ! misho 1334: struct isis_lsp *lsp;
! 1335: struct isis_dynhn *dynhn;
! 1336: const char *pos = argv;
! 1337: u_char lspid[ISIS_SYS_ID_LEN+2];
! 1338: char sysid[255];
! 1339: u_char number[3];
1.1 misho 1340: int level, lsp_count;
1341:
1342: if (isis->area_list->count == 0)
1343: return CMD_SUCCESS;
1344:
1.1.1.2 ! misho 1345: memset (&lspid, 0, ISIS_SYS_ID_LEN);
! 1346: memset (&sysid, 0, 255);
! 1347:
! 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: */
! 1357: if (argv)
! 1358: strncpy (sysid, argv, 254);
! 1359: 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:
1.1 misho 1378: for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
1379: {
1380: vty_out (vty, "Area %s:%s", area->area_tag ? area->area_tag : "null",
1.1.1.2 ! misho 1381: VTY_NEWLINE);
1.1 misho 1382:
1.1.1.2 ! misho 1383: for (level = 0; level < ISIS_LEVELS; level++)
! 1384: {
! 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: }
! 1409:
! 1410: if (lsp != NULL || argv == NULL)
! 1411: {
! 1412: vty_out (vty, "IS-IS Level-%d link-state database:%s",
! 1413: level + 1, VTY_NEWLINE);
! 1414:
! 1415: /* 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: }
1.1 misho 1439: }
1440:
1441: return CMD_SUCCESS;
1442: }
1443:
1.1.1.2 ! misho 1444: DEFUN (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")
1.1 misho 1450: {
1.1.1.2 ! misho 1451: return show_isis_database (vty, NULL, ISIS_UI_LEVEL_BRIEF);
1.1 misho 1452: }
1453:
1.1.1.2 ! misho 1454: DEFUN (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")
1.1 misho 1461: {
1.1.1.2 ! misho 1462: return show_isis_database (vty, argv[0], ISIS_UI_LEVEL_BRIEF);
1.1 misho 1463: }
1464:
1.1.1.2 ! misho 1465: DEFUN (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:
! 1477: DEFUN (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: {
! 1484: return show_isis_database (vty, NULL, ISIS_UI_LEVEL_DETAIL);
! 1485: }
! 1486:
! 1487: DEFUN (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);
! 1497: }
! 1498:
! 1499: /*
! 1500: * 'router isis' command
! 1501: */
! 1502: DEFUN (router_isis,
! 1503: router_isis_cmd,
! 1504: "router isis WORD",
! 1505: ROUTER_STR
! 1506: "ISO IS-IS\n"
! 1507: "ISO Routing area tag")
! 1508: {
! 1509: return isis_area_get (vty, argv[0]);
! 1510: }
! 1511:
! 1512: /*
! 1513: *'no router isis' command
! 1514: */
! 1515: DEFUN (no_router_isis,
! 1516: no_router_isis_cmd,
! 1517: "no router isis WORD",
! 1518: "no\n" ROUTER_STR "ISO IS-IS\n" "ISO Routing area tag")
! 1519: {
! 1520: return isis_area_destroy (vty, argv[0]);
! 1521: }
! 1522:
! 1523: /*
! 1524: * 'net' command
1.1 misho 1525: */
1526: DEFUN (net,
1527: net_cmd,
1528: "net WORD",
1529: "A Network Entity Title for this process (OSI only)\n"
1530: "XX.XXXX. ... .XXX.XX Network entity title (NET)\n")
1531: {
1532: return area_net_title (vty, argv[0]);
1533: }
1534:
1535: /*
1536: * 'no net' command
1537: */
1538: DEFUN (no_net,
1539: no_net_cmd,
1540: "no net WORD",
1541: NO_STR
1542: "A Network Entity Title for this process (OSI only)\n"
1543: "XX.XXXX. ... .XXX.XX Network entity title (NET)\n")
1544: {
1545: return area_clear_net_title (vty, argv[0]);
1546: }
1547:
1.1.1.2 ! misho 1548: DEFUN (area_passwd_md5,
! 1549: area_passwd_md5_cmd,
! 1550: "area-password md5 WORD",
! 1551: "Configure the authentication password for an area\n"
! 1552: "Authentication type\n"
! 1553: "Area password\n")
! 1554: {
! 1555: struct isis_area *area;
! 1556: int len;
! 1557:
! 1558: area = vty->index;
! 1559:
! 1560: if (!area)
! 1561: {
! 1562: vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
! 1563: return CMD_ERR_NO_MATCH;
! 1564: }
! 1565:
! 1566: len = strlen (argv[0]);
! 1567: if (len > 254)
! 1568: {
! 1569: vty_out (vty, "Too long area password (>254)%s", VTY_NEWLINE);
! 1570: return CMD_ERR_AMBIGUOUS;
! 1571: }
! 1572:
! 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:
! 1595: ALIAS (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:
! 1606: DEFUN (area_passwd_clear,
! 1607: area_passwd_clear_cmd,
! 1608: "area-password clear WORD",
1.1 misho 1609: "Configure the authentication password for an area\n"
1.1.1.2 ! misho 1610: "Authentication type\n"
1.1 misho 1611: "Area password\n")
1612: {
1613: struct isis_area *area;
1614: int len;
1615:
1616: area = vty->index;
1617:
1618: if (!area)
1619: {
1.1.1.2 ! misho 1620: vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
! 1621: return CMD_ERR_NO_MATCH;
1.1 misho 1622: }
1623:
1624: len = strlen (argv[0]);
1625: if (len > 254)
1626: {
1627: vty_out (vty, "Too long area password (>254)%s", VTY_NEWLINE);
1.1.1.2 ! misho 1628: return CMD_ERR_AMBIGUOUS;
1.1 misho 1629: }
1.1.1.2 ! misho 1630:
1.1 misho 1631: area->area_passwd.len = (u_char) len;
1632: area->area_passwd.type = ISIS_PASSWD_TYPE_CLEARTXT;
1633: strncpy ((char *)area->area_passwd.passwd, argv[0], 255);
1634:
1635: 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: }
1.1.1.2 ! misho 1648: lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
1.1 misho 1649:
1650: return CMD_SUCCESS;
1651: }
1652:
1.1.1.2 ! misho 1653: ALIAS (area_passwd_clear,
! 1654: area_passwd_clear_snpauth_cmd,
! 1655: "area-password clear WORD authenticate snp (send-only|validate)",
1.1 misho 1656: "Configure the authentication password for an area\n"
1.1.1.2 ! misho 1657: "Authentication type\n"
1.1 misho 1658: "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:
1664: DEFUN (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;
1671:
1672: area = vty->index;
1673:
1674: if (!area)
1675: {
1.1.1.2 ! misho 1676: vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
! 1677: return CMD_ERR_NO_MATCH;
1.1 misho 1678: }
1679:
1680: memset (&area->area_passwd, 0, sizeof (struct isis_passwd));
1.1.1.2 ! misho 1681: lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
! 1682:
! 1683: return CMD_SUCCESS;
! 1684: }
! 1685:
! 1686: DEFUN (domain_passwd_md5,
! 1687: domain_passwd_md5_cmd,
! 1688: "domain-password md5 WORD",
! 1689: "Set the authentication password for a routing domain\n"
! 1690: "Authentication type\n"
! 1691: "Routing domain password\n")
! 1692: {
! 1693: struct isis_area *area;
! 1694: int len;
! 1695:
! 1696: area = vty->index;
! 1697:
! 1698: if (!area)
! 1699: {
! 1700: vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
! 1701: return CMD_ERR_NO_MATCH;
! 1702: }
! 1703:
! 1704: len = strlen (argv[0]);
! 1705: if (len > 254)
! 1706: {
! 1707: vty_out (vty, "Too long area password (>254)%s", VTY_NEWLINE);
! 1708: return CMD_ERR_AMBIGUOUS;
! 1709: }
! 1710:
! 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);
1.1 misho 1729:
1730: return CMD_SUCCESS;
1731: }
1732:
1.1.1.2 ! misho 1733: ALIAS (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:
! 1744: DEFUN (domain_passwd_clear,
! 1745: domain_passwd_clear_cmd,
! 1746: "domain-password clear WORD",
1.1 misho 1747: "Set the authentication password for a routing domain\n"
1.1.1.2 ! misho 1748: "Authentication type\n"
1.1 misho 1749: "Routing domain password\n")
1750: {
1751: struct isis_area *area;
1752: int len;
1753:
1754: area = vty->index;
1755:
1756: if (!area)
1757: {
1.1.1.2 ! misho 1758: vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
! 1759: return CMD_ERR_NO_MATCH;
1.1 misho 1760: }
1761:
1762: len = strlen (argv[0]);
1763: if (len > 254)
1764: {
1765: vty_out (vty, "Too long area password (>254)%s", VTY_NEWLINE);
1.1.1.2 ! misho 1766: return CMD_ERR_AMBIGUOUS;
1.1 misho 1767: }
1.1.1.2 ! misho 1768:
1.1 misho 1769: area->domain_passwd.len = (u_char) len;
1770: area->domain_passwd.type = ISIS_PASSWD_TYPE_CLEARTXT;
1771: strncpy ((char *)area->domain_passwd.passwd, argv[0], 255);
1772:
1773: 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: }
1.1.1.2 ! misho 1786: lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
1.1 misho 1787:
1788: return CMD_SUCCESS;
1789: }
1790:
1.1.1.2 ! misho 1791: ALIAS (domain_passwd_clear,
! 1792: domain_passwd_clear_snpauth_cmd,
! 1793: "domain-password clear WORD authenticate snp (send-only|validate)",
1.1 misho 1794: "Set the authentication password for a routing domain\n"
1.1.1.2 ! misho 1795: "Authentication type\n"
1.1 misho 1796: "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:
1802: DEFUN (no_domain_passwd,
1803: no_domain_passwd_cmd,
1.1.1.2 ! misho 1804: "no domain-password",
1.1 misho 1805: NO_STR
1806: "Set the authentication password for a routing domain\n")
1807: {
1808: struct isis_area *area;
1809:
1810: area = vty->index;
1811:
1812: if (!area)
1813: {
1.1.1.2 ! misho 1814: vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
! 1815: return CMD_ERR_NO_MATCH;
1.1 misho 1816: }
1817:
1818: memset (&area->domain_passwd, 0, sizeof (struct isis_passwd));
1.1.1.2 ! misho 1819: lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
1.1 misho 1820:
1821: return CMD_SUCCESS;
1822: }
1823:
1824: DEFUN (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:
1837: if (!area)
1838: {
1.1.1.2 ! misho 1839: vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
! 1840: return CMD_ERR_NO_MATCH;
1.1 misho 1841: }
1842:
1843: type = string2circuit_t (argv[0]);
1844: if (!type)
1845: {
1846: vty_out (vty, "Unknown IS level %s", VTY_NEWLINE);
1847: return CMD_SUCCESS;
1848: }
1849:
1850: isis_event_system_type_change (area, type);
1851:
1852: return CMD_SUCCESS;
1853: }
1854:
1855: DEFUN (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: {
1864: struct isis_area *area;
1865: int type;
1866:
1867: area = vty->index;
1868: assert (area);
1869:
1870: /*
1.1.1.2 ! misho 1871: * Put the is-type back to defaults:
! 1872: * - level-1-2 on first area
! 1873: * - level-1 for the rest
1.1 misho 1874: */
1875: if (listgetdata (listhead (isis->area_list)) == area)
1876: 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:
1.1.1.2 ! misho 1885: static int
! 1886: set_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:
1.1 misho 1915: DEFUN (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;
1.1.1.2 ! misho 1923: int level;
1.1 misho 1924:
1925: area = vty->index;
1926: interval = atoi (argv[0]);
1.1.1.2 ! misho 1927: level = IS_LEVEL_1 | IS_LEVEL_2;
! 1928: return set_lsp_gen_interval (vty, area, interval, level);
1.1 misho 1929: }
1930:
1931: DEFUN (no_lsp_gen_interval,
1932: no_lsp_gen_interval_cmd,
1933: "no lsp-gen-interval",
1934: NO_STR
1935: "Minimum interval between regenerating same LSP\n")
1936: {
1937: struct isis_area *area;
1.1.1.2 ! misho 1938: uint16_t interval;
! 1939: int level;
1.1 misho 1940:
1941: area = vty->index;
1.1.1.2 ! misho 1942: interval = DEFAULT_MIN_LSP_GEN_INTERVAL;
! 1943: level = IS_LEVEL_1 | IS_LEVEL_2;
! 1944: return set_lsp_gen_interval (vty, area, interval, level);
1.1 misho 1945: }
1946:
1947: ALIAS (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"
1952: "Minimum interval in seconds\n")
1953:
1954: DEFUN (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"
1959: "Minimum interval in seconds\n")
1960: {
1961: struct isis_area *area;
1962: uint16_t interval;
1.1.1.2 ! misho 1963: int level;
1.1 misho 1964:
1965: area = vty->index;
1966: interval = atoi (argv[0]);
1.1.1.2 ! misho 1967: level = IS_LEVEL_1;
! 1968: return set_lsp_gen_interval (vty, area, interval, level);
1.1 misho 1969: }
1970:
1971: DEFUN (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"
1976: "Set interval for level 1 only\n")
1977: {
1978: struct isis_area *area;
1.1.1.2 ! misho 1979: uint16_t interval;
! 1980: int level;
1.1 misho 1981:
1982: area = vty->index;
1.1.1.2 ! misho 1983: interval = DEFAULT_MIN_LSP_GEN_INTERVAL;
! 1984: level = IS_LEVEL_1;
! 1985: return set_lsp_gen_interval (vty, area, interval, level);
1.1 misho 1986: }
1987:
1988: ALIAS (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"
1994: "Minimum interval in seconds\n")
1995:
1996: DEFUN (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"
2001: "Minimum interval in seconds\n")
2002: {
2003: struct isis_area *area;
1.1.1.2 ! misho 2004: uint16_t interval;
! 2005: int level;
1.1 misho 2006:
2007: area = vty->index;
2008: interval = atoi (argv[0]);
1.1.1.2 ! misho 2009: level = IS_LEVEL_2;
! 2010: return set_lsp_gen_interval (vty, area, interval, level);
1.1 misho 2011: }
2012:
2013: DEFUN (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"
2018: "Set interval for level 2 only\n")
2019: {
2020: struct isis_area *area;
1.1.1.2 ! misho 2021: uint16_t interval;
! 2022: int level;
1.1 misho 2023:
2024: area = vty->index;
1.1.1.2 ! misho 2025: interval = DEFAULT_MIN_LSP_GEN_INTERVAL;
! 2026: level = IS_LEVEL_2;
! 2027: return set_lsp_gen_interval (vty, area, interval, level);
1.1 misho 2028: }
2029:
2030: ALIAS (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"
2036: "Minimum interval in seconds\n")
2037:
1.1.1.2 ! misho 2038: static int
! 2039: validate_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:
1.1 misho 2076: DEFUN (metric_style,
2077: metric_style_cmd,
2078: "metric-style (narrow|transition|wide)",
2079: "Use old-style (ISO 10589) or new-style packet formats\n"
2080: "Use old style of TLVs with narrow metric\n"
2081: "Send and accept both styles of TLVs during transition\n"
2082: "Use new style of TLVs to carry wider metric\n")
2083: {
2084: struct isis_area *area;
1.1.1.2 ! misho 2085: int ret;
1.1 misho 2086:
2087: area = vty->index;
2088: assert (area);
2089:
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: {
1.1.1.2 ! misho 2102: ret = validate_metric_style_narrow (vty, area);
! 2103: if (ret != CMD_SUCCESS)
! 2104: return ret;
! 2105:
1.1 misho 2106: area->newmetric = 0;
2107: area->oldmetric = 1;
2108: }
2109:
2110: return CMD_SUCCESS;
2111: }
2112:
2113: DEFUN (no_metric_style,
2114: no_metric_style_cmd,
2115: "no metric-style",
2116: NO_STR
2117: "Use old-style (ISO 10589) or new-style packet formats\n")
2118: {
2119: struct isis_area *area;
1.1.1.2 ! misho 2120: int ret;
1.1 misho 2121:
2122: area = vty->index;
2123: assert (area);
2124:
1.1.1.2 ! misho 2125: ret = validate_metric_style_narrow (vty, area);
! 2126: if (ret != CMD_SUCCESS)
! 2127: return ret;
! 2128:
1.1 misho 2129: /* Default is narrow metric. */
2130: area->newmetric = 0;
2131: area->oldmetric = 1;
2132:
2133: return CMD_SUCCESS;
2134: }
2135:
1.1.1.2 ! misho 2136: DEFUN (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:
! 2153: DEFUN (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:
1.1 misho 2170: DEFUN (dynamic_hostname,
2171: dynamic_hostname_cmd,
2172: "hostname dynamic",
2173: "Dynamic hostname for IS-IS\n"
2174: "Dynamic hostname\n")
2175: {
2176: struct isis_area *area;
2177:
2178: area = vty->index;
2179: assert (area);
2180:
1.1.1.2 ! misho 2181: if (!area->dynhostname)
! 2182: {
! 2183: area->dynhostname = 1;
! 2184: lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 0);
! 2185: }
1.1 misho 2186:
2187: return CMD_SUCCESS;
2188: }
2189:
2190: DEFUN (no_dynamic_hostname,
2191: no_dynamic_hostname_cmd,
2192: "no hostname dynamic",
2193: NO_STR
2194: "Dynamic hostname for IS-IS\n"
2195: "Dynamic hostname\n")
2196: {
2197: struct isis_area *area;
2198:
2199: area = vty->index;
2200: assert (area);
2201:
1.1.1.2 ! misho 2202: if (area->dynhostname)
! 2203: {
! 2204: area->dynhostname = 0;
! 2205: lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 0);
! 2206: }
1.1 misho 2207:
2208: return CMD_SUCCESS;
2209: }
2210:
2211: DEFUN (spf_interval,
2212: spf_interval_cmd,
2213: "spf-interval <1-120>",
2214: "Minimum interval between SPF calculations\n"
2215: "Minimum interval between consecutive SPFs in seconds\n")
2216: {
2217: struct isis_area *area;
2218: u_int16_t interval;
2219:
2220: area = vty->index;
2221: interval = atoi (argv[0]);
2222: area->min_spf_interval[0] = interval;
2223: area->min_spf_interval[1] = interval;
2224:
2225: return CMD_SUCCESS;
2226: }
2227:
2228: DEFUN (no_spf_interval,
2229: no_spf_interval_cmd,
2230: "no spf-interval",
2231: NO_STR
2232: "Minimum interval between SPF calculations\n")
2233: {
2234: struct isis_area *area;
2235:
2236: area = vty->index;
2237:
2238: area->min_spf_interval[0] = MINIMUM_SPF_INTERVAL;
2239: area->min_spf_interval[1] = MINIMUM_SPF_INTERVAL;
2240:
2241: return CMD_SUCCESS;
2242: }
2243:
2244: ALIAS (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"
2249: "Minimum interval between consecutive SPFs in seconds\n")
2250:
2251: DEFUN (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;
2260:
2261: area = vty->index;
2262: interval = atoi (argv[0]);
2263: area->min_spf_interval[0] = interval;
2264:
2265: return CMD_SUCCESS;
2266: }
2267:
2268: DEFUN (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;
2276:
2277: area = vty->index;
2278:
2279: area->min_spf_interval[0] = MINIMUM_SPF_INTERVAL;
2280:
2281: return CMD_SUCCESS;
2282: }
2283:
2284: ALIAS (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:
2292: DEFUN (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;
2301:
2302: area = vty->index;
2303: interval = atoi (argv[0]);
2304: area->min_spf_interval[1] = interval;
2305:
2306: return CMD_SUCCESS;
2307: }
2308:
2309: DEFUN (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;
2317:
2318: area = vty->index;
2319:
2320: area->min_spf_interval[1] = MINIMUM_SPF_INTERVAL;
2321:
2322: return CMD_SUCCESS;
2323: }
2324:
2325: ALIAS (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:
1.1.1.2 ! misho 2333: static int
! 2334: set_lsp_max_lifetime (struct vty *vty, struct isis_area *area,
! 2335: uint16_t interval, int level)
1.1 misho 2336: {
1.1.1.2 ! misho 2337: int lvl;
! 2338: int set_refresh_interval[ISIS_LEVELS] = {0, 0};
! 2339: uint16_t refresh_interval;
1.1 misho 2340:
1.1.1.2 ! misho 2341: refresh_interval = interval - 300;
1.1 misho 2342:
1.1.1.2 ! misho 2343: for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; lvl++)
1.1 misho 2344: {
1.1.1.2 ! misho 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;
1.1 misho 2375: }
2376:
1.1.1.2 ! misho 2377: lsp_regenerate_schedule (area, level, 1);
! 2378:
1.1 misho 2379: return CMD_SUCCESS;
2380: }
2381:
1.1.1.2 ! misho 2382: DEFUN (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")
1.1 misho 2387: {
2388: struct isis_area *area;
1.1.1.2 ! misho 2389: uint16_t interval;
! 2390: int level;
1.1 misho 2391:
1.1.1.2 ! misho 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);
1.1 misho 2396: }
2397:
1.1.1.2 ! misho 2398: DEFUN (no_max_lsp_lifetime,
! 2399: no_max_lsp_lifetime_cmd,
! 2400: "no max-lsp-lifetime",
! 2401: NO_STR
! 2402: "LSP lifetime in seconds\n")
1.1 misho 2403: {
2404: struct isis_area *area;
1.1.1.2 ! misho 2405: uint16_t interval;
! 2406: int level;
1.1 misho 2407:
2408: area = vty->index;
1.1.1.2 ! misho 2409: interval = DEFAULT_LSP_LIFETIME;
! 2410: level = IS_LEVEL_1 | IS_LEVEL_2;
! 2411: return set_lsp_max_lifetime (vty, area, interval, level);
1.1 misho 2412: }
2413:
1.1.1.2 ! misho 2414: ALIAS (no_max_lsp_lifetime,
! 2415: no_max_lsp_lifetime_arg_cmd,
! 2416: "no max-lsp-lifetime <350-65535>",
1.1 misho 2417: NO_STR
1.1.1.2 ! misho 2418: "Maximum LSP lifetime\n"
! 2419: "LSP lifetime in seconds\n")
! 2420:
! 2421: DEFUN (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")
1.1 misho 2426: {
2427: struct isis_area *area;
1.1.1.2 ! misho 2428: uint16_t interval;
! 2429: int level;
1.1 misho 2430:
2431: area = vty->index;
1.1.1.2 ! misho 2432: interval = atoi (argv[0]);
! 2433: level = IS_LEVEL_1;
! 2434: return set_lsp_max_lifetime (vty, area, interval, level);
1.1 misho 2435: }
2436:
1.1.1.2 ! misho 2437: DEFUN (no_max_lsp_lifetime_l1,
! 2438: no_max_lsp_lifetime_l1_cmd,
! 2439: "no max-lsp-lifetime level-1",
1.1 misho 2440: NO_STR
1.1.1.2 ! misho 2441: "LSP lifetime for Level 1 only in seconds\n")
1.1 misho 2442: {
2443: struct isis_area *area;
1.1.1.2 ! misho 2444: uint16_t interval;
! 2445: int level;
1.1 misho 2446:
2447: area = vty->index;
1.1.1.2 ! misho 2448: interval = DEFAULT_LSP_LIFETIME;
! 2449: level = IS_LEVEL_1;
! 2450: return set_lsp_max_lifetime (vty, area, interval, level);
1.1 misho 2451: }
2452:
1.1.1.2 ! misho 2453: ALIAS (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:
! 2460: DEFUN (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")
1.1 misho 2465: {
2466: struct isis_area *area;
2467: uint16_t interval;
1.1.1.2 ! misho 2468: int level;
1.1 misho 2469:
2470: area = vty->index;
2471: interval = atoi (argv[0]);
1.1.1.2 ! misho 2472: level = IS_LEVEL_2;
! 2473: return set_lsp_max_lifetime (vty, area, interval, level);
! 2474: }
1.1 misho 2475:
1.1.1.2 ! misho 2476: DEFUN (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;
1.1 misho 2485:
1.1.1.2 ! misho 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: }
1.1 misho 2491:
1.1.1.2 ! misho 2492: ALIAS (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")
1.1 misho 2498:
1.1.1.2 ! misho 2499: static int
! 2500: set_lsp_refresh_interval (struct vty *vty, struct isis_area *area,
! 2501: uint16_t interval, int level)
! 2502: {
! 2503: int lvl;
1.1 misho 2504:
1.1.1.2 ! misho 2505: for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl)
1.1 misho 2506: {
1.1.1.2 ! misho 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: }
1.1 misho 2525: }
2526:
1.1.1.2 ! misho 2527: for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl)
1.1 misho 2528: {
1.1.1.2 ! misho 2529: if (!(lvl & level))
! 2530: continue;
! 2531: area->lsp_refresh[lvl-1] = interval;
1.1 misho 2532: }
1.1.1.2 ! misho 2533: lsp_regenerate_schedule (area, level, 1);
1.1 misho 2534:
2535: return CMD_SUCCESS;
2536: }
2537:
1.1.1.2 ! misho 2538: DEFUN (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")
1.1 misho 2543: {
2544: struct isis_area *area;
1.1.1.2 ! misho 2545: uint16_t interval;
! 2546: int level;
1.1 misho 2547:
2548: area = vty->index;
1.1.1.2 ! misho 2549: interval = atoi (argv[0]);
! 2550: level = IS_LEVEL_1 | IS_LEVEL_2;
! 2551: return set_lsp_refresh_interval (vty, area, interval, level);
! 2552: }
1.1 misho 2553:
1.1.1.2 ! misho 2554: DEFUN (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;
1.1 misho 2563:
1.1.1.2 ! misho 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);
1.1 misho 2568: }
2569:
1.1.1.2 ! misho 2570: ALIAS (no_lsp_refresh_interval,
! 2571: no_lsp_refresh_interval_arg_cmd,
! 2572: "no lsp-refresh-interval <1-65235>",
1.1 misho 2573: NO_STR
1.1.1.2 ! misho 2574: "LSP refresh interval\n"
! 2575: "LSP refresh interval in seconds\n")
1.1 misho 2576:
1.1.1.2 ! misho 2577: DEFUN (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")
1.1 misho 2582: {
2583: struct isis_area *area;
2584: uint16_t interval;
1.1.1.2 ! misho 2585: int level;
1.1 misho 2586:
2587: area = vty->index;
1.1.1.2 ! misho 2588: interval = atoi (argv[0]);
! 2589: level = IS_LEVEL_1;
! 2590: return set_lsp_refresh_interval (vty, area, interval, level);
! 2591: }
1.1 misho 2592:
1.1.1.2 ! misho 2593: DEFUN (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:
! 2609: ALIAS (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:
! 2616: DEFUN (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;
1.1 misho 2627: interval = atoi (argv[0]);
1.1.1.2 ! misho 2628: level = IS_LEVEL_2;
! 2629: return set_lsp_refresh_interval (vty, area, interval, level);
! 2630: }
1.1 misho 2631:
1.1.1.2 ! misho 2632: DEFUN (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;
1.1 misho 2641:
1.1.1.2 ! misho 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:
! 2648: ALIAS (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:
! 2655: DEFUN (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;
1.1 misho 2661:
1.1.1.2 ! misho 2662: area = vty->index;
! 2663: assert (area);
1.1 misho 2664:
1.1.1.2 ! misho 2665: area->log_adj_changes = 1;
1.1 misho 2666:
2667: return CMD_SUCCESS;
2668: }
2669:
1.1.1.2 ! misho 2670: DEFUN (no_log_adj_changes,
! 2671: no_log_adj_changes_cmd,
! 2672: "no log-adjacency-changes",
! 2673: "Stop logging changes in adjacency state\n")
1.1 misho 2674: {
2675: struct isis_area *area;
2676:
2677: area = vty->index;
2678: assert (area);
2679:
1.1.1.2 ! misho 2680: area->log_adj_changes = 0;
1.1 misho 2681:
2682: return CMD_SUCCESS;
2683: }
2684:
1.1.1.2 ! misho 2685: #ifdef TOPOLOGY_GENERATE
1.1 misho 2686:
1.1.1.2 ! misho 2687: DEFUN (topology_generate_grid,
! 2688: topology_generate_grid_cmd,
! 2689: "topology generate grid <1-100> <1-100> <1-65000> [param] [param] "
! 2690: "[param]",
! 2691: "Topology generation for IS-IS\n"
! 2692: "Topology generation\n"
! 2693: "Grid topology\n"
! 2694: "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")
1.1 misho 2701: {
2702: struct isis_area *area;
2703:
2704: area = vty->index;
2705: assert (area);
2706:
1.1.1.2 ! misho 2707: 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);
! 2716: /* Regenerate L1 LSP to get two way connection to the generated
! 2717: * topology. */
! 2718: lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
! 2719: }
! 2720:
! 2721: return CMD_SUCCESS;
! 2722: }
! 2723:
! 2724: DEFUN (show_isis_generated_topology,
! 2725: show_isis_generated_topology_cmd,
! 2726: "show isis generated-topologies",
! 2727: SHOW_STR
! 2728: "ISIS network information\n"
! 2729: "Show generated topologies\n")
! 2730: {
! 2731: struct isis_area *area;
! 2732: struct listnode *node;
! 2733: struct listnode *node2;
! 2734: struct arc *arc;
1.1 misho 2735:
1.1.1.2 ! misho 2736: for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
1.1 misho 2737: {
1.1.1.2 ! misho 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);
1.1 misho 2744:
1.1.1.2 ! misho 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);
1.1 misho 2748: }
1.1.1.2 ! misho 2749: return CMD_SUCCESS;
! 2750: }
! 2751:
! 2752: /* Base IS for topology generation. */
! 2753: DEFUN (topology_baseis,
! 2754: topology_baseis_cmd,
! 2755: "topology base-is WORD",
! 2756: "Topology generation for IS-IS\n"
! 2757: "A Network IS Base for this topology\n"
! 2758: "XXXX.XXXX.XXXX Network entity title (NET)\n")
! 2759: {
! 2760: struct isis_area *area;
! 2761: u_char buff[ISIS_SYS_ID_LEN];
! 2762:
! 2763: area = vty->index;
! 2764: assert (area);
1.1 misho 2765:
1.1.1.2 ! misho 2766: if (sysid2buff (buff, argv[0]))
! 2767: sysid2buff (area->topology_baseis, argv[0]);
1.1 misho 2768:
2769: return CMD_SUCCESS;
2770: }
2771:
1.1.1.2 ! misho 2772: DEFUN (no_topology_baseis,
! 2773: no_topology_baseis_cmd,
! 2774: "no topology base-is WORD",
1.1 misho 2775: NO_STR
1.1.1.2 ! misho 2776: "Topology generation for IS-IS\n"
! 2777: "A Network IS Base for this topology\n"
! 2778: "XXXX.XXXX.XXXX Network entity title (NET)\n")
1.1 misho 2779: {
2780: struct isis_area *area;
2781:
2782: area = vty->index;
2783: assert (area);
2784:
1.1.1.2 ! misho 2785: memcpy (area->topology_baseis, DEFAULT_TOPOLOGY_BASEIS, ISIS_SYS_ID_LEN);
1.1 misho 2786: return CMD_SUCCESS;
2787: }
2788:
1.1.1.2 ! misho 2789: ALIAS (no_topology_baseis,
! 2790: no_topology_baseis_noid_cmd,
! 2791: "no topology base-is",
1.1 misho 2792: NO_STR
1.1.1.2 ! misho 2793: "Topology generation for IS-IS\n"
! 2794: "A Network IS Base for this topology\n")
! 2795:
! 2796: DEFUN (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: }
! 2812:
! 2813: #endif /* TOPOLOGY_GENERATE */
1.1 misho 2814:
2815: /* IS-IS configuration write function */
2816: int
2817: isis_config_write (struct vty *vty)
2818: {
2819: int write = 0;
2820:
2821: if (isis != NULL)
2822: {
2823: struct isis_area *area;
2824: struct listnode *node, *node2;
2825:
2826: for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
2827: {
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;
2835: 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: }
2843: }
2844: /* ISIS - Dynamic hostname - Defaults to true so only display if
2845: * false. */
2846: if (!area->dynhostname)
2847: {
2848: vty_out (vty, " no hostname dynamic%s", VTY_NEWLINE);
2849: write++;
2850: }
2851: /* ISIS - Metric-Style - when true displays wide */
2852: if (area->newmetric)
2853: {
2854: if (!area->oldmetric)
2855: vty_out (vty, " metric-style wide%s", VTY_NEWLINE);
2856: else
2857: vty_out (vty, " metric-style transition%s", VTY_NEWLINE);
2858: write++;
2859: }
1.1.1.2 ! misho 2860: /* ISIS - overload-bit */
! 2861: if (area->overload_bit)
! 2862: {
! 2863: vty_out (vty, " set-overload-bit%s", VTY_NEWLINE);
! 2864: write++;
! 2865: }
1.1 misho 2866: /* 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: }
1.1.1.2 ! misho 2872: else if (area->is_type == IS_LEVEL_2)
1.1 misho 2873: {
1.1.1.2 ! misho 2874: vty_out (vty, " is-type level-2-only%s", VTY_NEWLINE);
! 2875: write++;
1.1 misho 2876: }
2877: /* ISIS - Lsp generation interval */
2878: if (area->lsp_gen_interval[0] == area->lsp_gen_interval[1])
2879: {
1.1.1.2 ! misho 2880: if (area->lsp_gen_interval[0] != DEFAULT_MIN_LSP_GEN_INTERVAL)
1.1 misho 2881: {
2882: vty_out (vty, " lsp-gen-interval %d%s",
2883: area->lsp_gen_interval[0], VTY_NEWLINE);
2884: write++;
2885: }
2886: }
2887: else
2888: {
1.1.1.2 ! misho 2889: if (area->lsp_gen_interval[0] != DEFAULT_MIN_LSP_GEN_INTERVAL)
1.1 misho 2890: {
2891: vty_out (vty, " lsp-gen-interval level-1 %d%s",
2892: area->lsp_gen_interval[0], VTY_NEWLINE);
2893: write++;
2894: }
1.1.1.2 ! misho 2895: if (area->lsp_gen_interval[1] != DEFAULT_MIN_LSP_GEN_INTERVAL)
1.1 misho 2896: {
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: {
1.1.1.2 ! misho 2905: if (area->max_lsp_lifetime[0] != DEFAULT_LSP_LIFETIME)
1.1 misho 2906: {
1.1.1.2 ! misho 2907: vty_out (vty, " max-lsp-lifetime %u%s", area->max_lsp_lifetime[0],
1.1 misho 2908: VTY_NEWLINE);
2909: write++;
2910: }
2911: }
2912: else
2913: {
1.1.1.2 ! misho 2914: if (area->max_lsp_lifetime[0] != DEFAULT_LSP_LIFETIME)
1.1 misho 2915: {
1.1.1.2 ! misho 2916: vty_out (vty, " max-lsp-lifetime level-1 %u%s",
1.1 misho 2917: area->max_lsp_lifetime[0], VTY_NEWLINE);
2918: write++;
2919: }
1.1.1.2 ! misho 2920: if (area->max_lsp_lifetime[1] != DEFAULT_LSP_LIFETIME)
1.1 misho 2921: {
1.1.1.2 ! misho 2922: vty_out (vty, " max-lsp-lifetime level-2 %u%s",
1.1 misho 2923: area->max_lsp_lifetime[1], VTY_NEWLINE);
2924: write++;
2925: }
2926: }
1.1.1.2 ! misho 2927: /* 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: }
1.1 misho 2952: /* 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: }
2977: /* Authentication passwords. */
1.1.1.2 ! misho 2978: if (area->area_passwd.type == ISIS_PASSWD_TYPE_HMAC_MD5)
1.1 misho 2979: {
1.1.1.2 ! misho 2980: vty_out(vty, " area-password md5 %s", area->area_passwd.passwd);
! 2981: 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);
! 2990: write++;
! 2991: }
! 2992: else if (area->area_passwd.type == ISIS_PASSWD_TYPE_CLEARTXT)
! 2993: {
! 2994: vty_out(vty, " area-password clear %s", area->area_passwd.passwd);
1.1 misho 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++;
1.1.1.2 ! misho 3005: }
! 3006: if (area->domain_passwd.type == ISIS_PASSWD_TYPE_HMAC_MD5)
1.1 misho 3007: {
1.1.1.2 ! misho 3008: 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);
1.1 misho 3025: 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);
3034: write++;
3035: }
3036:
1.1.1.2 ! misho 3037: if (area->log_adj_changes)
! 3038: {
! 3039: vty_out (vty, " log-adjacency-changes%s", VTY_NEWLINE);
! 3040: write++;
! 3041: }
! 3042:
1.1 misho 3043: #ifdef TOPOLOGY_GENERATE
3044: if (memcmp (area->topology_baseis, DEFAULT_TOPOLOGY_BASEIS,
3045: ISIS_SYS_ID_LEN))
3046: {
3047: vty_out (vty, " topology base-is %s%s",
1.1.1.2 ! misho 3048: sysid_print ((u_char *)area->topology_baseis), VTY_NEWLINE);
1.1 misho 3049: 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))
3059: {
3060: vty_out (vty, " %s%s", area->top_params, VTY_NEWLINE);
3061: write++;
3062: }
3063: #endif /* TOPOLOGY_GENERATE */
3064:
3065: }
3066: }
3067:
3068: return write;
3069: }
3070:
1.1.1.2 ! misho 3071: struct cmd_node isis_node = {
1.1 misho 3072: ISIS_NODE,
3073: "%s(config-router)# ",
3074: 1
3075: };
3076:
3077: void
3078: isis_init ()
3079: {
3080: /* Install IS-IS top node */
3081: install_node (&isis_node, isis_config_write);
3082:
1.1.1.2 ! misho 3083: 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);
1.1 misho 3094:
3095: install_element (VIEW_NODE, &show_hostname_cmd);
3096: install_element (VIEW_NODE, &show_database_cmd);
1.1.1.2 ! misho 3097: install_element (VIEW_NODE, &show_database_arg_cmd);
! 3098: install_element (VIEW_NODE, &show_database_arg_detail_cmd);
1.1 misho 3099: install_element (VIEW_NODE, &show_database_detail_cmd);
1.1.1.2 ! misho 3100: install_element (VIEW_NODE, &show_database_detail_arg_cmd);
! 3101:
! 3102: install_element (ENABLE_NODE, &show_isis_summary_cmd);
1.1 misho 3103:
1.1.1.2 ! misho 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);
1.1 misho 3113:
3114: install_element (ENABLE_NODE, &show_hostname_cmd);
3115: install_element (ENABLE_NODE, &show_database_cmd);
1.1.1.2 ! misho 3116: install_element (ENABLE_NODE, &show_database_arg_cmd);
! 3117: install_element (ENABLE_NODE, &show_database_arg_detail_cmd);
1.1 misho 3118: install_element (ENABLE_NODE, &show_database_detail_cmd);
1.1.1.2 ! misho 3119: install_element (ENABLE_NODE, &show_database_detail_arg_cmd);
1.1 misho 3120: install_element (ENABLE_NODE, &show_debugging_cmd);
3121:
3122: install_node (&debug_node, config_write_debug);
3123:
3124: 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);
1.1.1.2 ! misho 3146: install_element (ENABLE_NODE, &debug_isis_packet_dump_cmd);
! 3147: install_element (ENABLE_NODE, &no_debug_isis_packet_dump_cmd);
1.1 misho 3148:
3149: 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);
1.1.1.2 ! misho 3171: install_element (CONFIG_NODE, &debug_isis_packet_dump_cmd);
! 3172: install_element (CONFIG_NODE, &no_debug_isis_packet_dump_cmd);
1.1 misho 3173:
3174: 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:
1.1.1.2 ! misho 3185: 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);
1.1 misho 3189: install_element (ISIS_NODE, &no_area_passwd_cmd);
3190:
1.1.1.2 ! misho 3191: 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);
1.1 misho 3195: 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);
3216:
1.1.1.2 ! misho 3217: 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);
1.1 misho 3239:
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);
1.1.1.2 ! misho 3245:
! 3246: install_element (ISIS_NODE, &log_adj_changes_cmd);
! 3247: install_element (ISIS_NODE, &no_log_adj_changes_cmd);
! 3248:
1.1 misho 3249: #ifdef TOPOLOGY_GENERATE
3250: install_element (ISIS_NODE, &topology_generate_grid_cmd);
3251: install_element (ISIS_NODE, &topology_baseis_cmd);
3252: install_element (ISIS_NODE, &topology_basedynh_cmd);
3253: install_element (ISIS_NODE, &no_topology_baseis_cmd);
3254: install_element (ISIS_NODE, &no_topology_baseis_noid_cmd);
3255: install_element (VIEW_NODE, &show_isis_generated_topology_cmd);
3256: install_element (ENABLE_NODE, &show_isis_generated_topology_cmd);
3257: #endif /* TOPOLOGY_GENERATE */
3258: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>