blob: 75953ff81d8e60ca49e2d1b025c18b4ff33d8369 [file] [log] [blame]
jardineb5d44e2003-12-23 08:09:43 +00001/*
2 * IS-IS Rout(e)ing protocol - isis_circuit.h
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 */
jardineb5d44e2003-12-23 08:09:43 +000022#include <zebra.h>
hasso37da8c02004-05-19 11:38:40 +000023#ifdef GNU_LINUX
jardineb5d44e2003-12-23 08:09:43 +000024#include <net/ethernet.h>
hasso37da8c02004-05-19 11:38:40 +000025#else
26#include <netinet/if_ether.h>
27#endif
jardineb5d44e2003-12-23 08:09:43 +000028
Paul Jakma238497f2007-08-07 18:49:18 +000029#ifndef ETHER_ADDR_LEN
30#define ETHER_ADDR_LEN ETHERADDRL
31#endif
32
jardineb5d44e2003-12-23 08:09:43 +000033#include "log.h"
34#include "memory.h"
35#include "if.h"
36#include "linklist.h"
37#include "command.h"
38#include "thread.h"
Olivier Dugeon4f593572016-04-19 19:03:05 +020039#include "vty.h"
jardineb5d44e2003-12-23 08:09:43 +000040#include "hash.h"
41#include "prefix.h"
42#include "stream.h"
43
44#include "isisd/dict.h"
45#include "isisd/include-netbsd/iso.h"
46#include "isisd/isis_constants.h"
47#include "isisd/isis_common.h"
Josh Bailey3f045a02012-03-24 08:35:20 -070048#include "isisd/isis_flags.h"
jardineb5d44e2003-12-23 08:09:43 +000049#include "isisd/isis_circuit.h"
50#include "isisd/isis_tlv.h"
51#include "isisd/isis_lsp.h"
52#include "isisd/isis_pdu.h"
53#include "isisd/isis_network.h"
54#include "isisd/isis_misc.h"
55#include "isisd/isis_constants.h"
56#include "isisd/isis_adjacency.h"
57#include "isisd/isis_dr.h"
jardineb5d44e2003-12-23 08:09:43 +000058#include "isisd/isisd.h"
59#include "isisd/isis_csm.h"
60#include "isisd/isis_events.h"
Olivier Dugeon4f593572016-04-19 19:03:05 +020061#include "isisd/isis_te.h"
jardineb5d44e2003-12-23 08:09:43 +000062
Paul Jakma41b36e92006-12-08 01:09:50 +000063/*
64 * Prototypes.
65 */
Paul Jakma41b36e92006-12-08 01:09:50 +000066int isis_interface_config_write(struct vty *);
67int isis_if_new_hook(struct interface *);
68int isis_if_delete_hook(struct interface *);
69
jardineb5d44e2003-12-23 08:09:43 +000070struct isis_circuit *
71isis_circuit_new ()
72{
73 struct isis_circuit *circuit;
74 int i;
75
hasso3fdb2dd2005-09-28 18:45:54 +000076 circuit = XCALLOC (MTYPE_ISIS_CIRCUIT, sizeof (struct isis_circuit));
Josh Bailey3f045a02012-03-24 08:35:20 -070077 if (circuit == NULL)
hassof390d2c2004-09-10 20:48:21 +000078 {
79 zlog_err ("Can't malloc isis circuit");
80 return NULL;
81 }
82
Josh Bailey3f045a02012-03-24 08:35:20 -070083 /*
84 * Default values
85 */
86 circuit->is_type = IS_LEVEL_1_AND_2;
87 circuit->flags = 0;
88 circuit->pad_hellos = 1;
89 for (i = 0; i < 2; i++)
90 {
91 circuit->hello_interval[i] = DEFAULT_HELLO_INTERVAL;
92 circuit->hello_multiplier[i] = DEFAULT_HELLO_MULTIPLIER;
93 circuit->csnp_interval[i] = DEFAULT_CSNP_INTERVAL;
94 circuit->psnp_interval[i] = DEFAULT_PSNP_INTERVAL;
95 circuit->priority[i] = DEFAULT_PRIORITY;
96 circuit->metrics[i].metric_default = DEFAULT_CIRCUIT_METRIC;
97 circuit->metrics[i].metric_expense = METRICS_UNSUPPORTED;
98 circuit->metrics[i].metric_error = METRICS_UNSUPPORTED;
99 circuit->metrics[i].metric_delay = METRICS_UNSUPPORTED;
100 circuit->te_metric[i] = DEFAULT_CIRCUIT_METRIC;
101 }
102
Olivier Dugeon4f593572016-04-19 19:03:05 +0200103 circuit->mtc = mpls_te_circuit_new();
104
jardineb5d44e2003-12-23 08:09:43 +0000105 return circuit;
106}
107
jardineb5d44e2003-12-23 08:09:43 +0000108void
Josh Bailey3f045a02012-03-24 08:35:20 -0700109isis_circuit_del (struct isis_circuit *circuit)
110{
111 if (!circuit)
112 return;
113
114 isis_circuit_if_unbind (circuit, circuit->interface);
115
116 /* and lastly the circuit itself */
117 XFREE (MTYPE_ISIS_CIRCUIT, circuit);
118
119 return;
120}
121
122void
jardineb5d44e2003-12-23 08:09:43 +0000123isis_circuit_configure (struct isis_circuit *circuit, struct isis_area *area)
124{
Josh Bailey3f045a02012-03-24 08:35:20 -0700125 assert (area);
jardineb5d44e2003-12-23 08:09:43 +0000126 circuit->area = area;
Josh Bailey3f045a02012-03-24 08:35:20 -0700127
jardineb5d44e2003-12-23 08:09:43 +0000128 /*
Christian Franke7324ae12015-11-10 18:04:48 +0100129 * Whenever the is-type of an area is changed, the is-type of each circuit
130 * in that area is updated to a non-empty subset of the area is-type.
131 * Inversely, when configuring a new circuit, this property should be
132 * ensured as well.
jardineb5d44e2003-12-23 08:09:43 +0000133 */
Christian Franke7324ae12015-11-10 18:04:48 +0100134 if (area->is_type != IS_LEVEL_1_AND_2)
135 circuit->is_type = area->is_type;
jardineb5d44e2003-12-23 08:09:43 +0000136
137 /*
138 * Add the circuit into area
139 */
140 listnode_add (area->circuit_list, circuit);
141
142 circuit->idx = flags_get_index (&area->flags);
jardineb5d44e2003-12-23 08:09:43 +0000143
144 return;
145}
146
hassof390d2c2004-09-10 20:48:21 +0000147void
Josh Bailey3f045a02012-03-24 08:35:20 -0700148isis_circuit_deconfigure (struct isis_circuit *circuit, struct isis_area *area)
jardineb5d44e2003-12-23 08:09:43 +0000149{
jardineb5d44e2003-12-23 08:09:43 +0000150 /* Free the index of SRM and SSN flags */
151 flags_free_index (&area->flags, circuit->idx);
Josh Bailey3f045a02012-03-24 08:35:20 -0700152 circuit->idx = 0;
153 /* Remove circuit from area */
154 assert (circuit->area == area);
155 listnode_delete (area->circuit_list, circuit);
156 circuit->area = NULL;
jardineb5d44e2003-12-23 08:09:43 +0000157
158 return;
159}
160
161struct isis_circuit *
162circuit_lookup_by_ifp (struct interface *ifp, struct list *list)
163{
164 struct isis_circuit *circuit = NULL;
165 struct listnode *node;
hassof390d2c2004-09-10 20:48:21 +0000166
jardineb5d44e2003-12-23 08:09:43 +0000167 if (!list)
168 return NULL;
hassof390d2c2004-09-10 20:48:21 +0000169
paul1eb8ef22005-04-07 07:30:20 +0000170 for (ALL_LIST_ELEMENTS_RO (list, node, circuit))
171 if (circuit->interface == ifp)
Josh Bailey3f045a02012-03-24 08:35:20 -0700172 {
173 assert (ifp->info == circuit);
174 return circuit;
175 }
176
jardineb5d44e2003-12-23 08:09:43 +0000177 return NULL;
178}
179
180struct isis_circuit *
181circuit_scan_by_ifp (struct interface *ifp)
182{
183 struct isis_area *area;
184 struct listnode *node;
185 struct isis_circuit *circuit;
186
Josh Bailey3f045a02012-03-24 08:35:20 -0700187 if (ifp->info)
188 return (struct isis_circuit *)ifp->info;
jardineb5d44e2003-12-23 08:09:43 +0000189
Josh Bailey3f045a02012-03-24 08:35:20 -0700190 if (isis->area_list)
hassof390d2c2004-09-10 20:48:21 +0000191 {
Josh Bailey3f045a02012-03-24 08:35:20 -0700192 for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
193 {
194 circuit = circuit_lookup_by_ifp (ifp, area->circuit_list);
195 if (circuit)
196 return circuit;
197 }
hassof390d2c2004-09-10 20:48:21 +0000198 }
jardineb5d44e2003-12-23 08:09:43 +0000199 return circuit_lookup_by_ifp (ifp, isis->init_circ_list);
200}
201
Olivier Dugeon4f593572016-04-19 19:03:05 +0200202struct isis_circuit * isis_circuit_lookup (struct vty *vty)
jardineb5d44e2003-12-23 08:09:43 +0000203{
Josh Bailey3f045a02012-03-24 08:35:20 -0700204 struct interface *ifp;
205 struct isis_circuit *circuit;
jardineb5d44e2003-12-23 08:09:43 +0000206
Josh Bailey3f045a02012-03-24 08:35:20 -0700207 ifp = (struct interface *) vty->index;
208 if (!ifp)
hassof390d2c2004-09-10 20:48:21 +0000209 {
Josh Bailey3f045a02012-03-24 08:35:20 -0700210 vty_out (vty, "Invalid interface %s", VTY_NEWLINE);
211 return NULL;
hassof390d2c2004-09-10 20:48:21 +0000212 }
hassof390d2c2004-09-10 20:48:21 +0000213
Josh Bailey3f045a02012-03-24 08:35:20 -0700214 circuit = circuit_scan_by_ifp (ifp);
215 if (!circuit)
216 {
217 vty_out (vty, "ISIS is not enabled on circuit %s%s",
218 ifp->name, VTY_NEWLINE);
219 return NULL;
220 }
jardineb5d44e2003-12-23 08:09:43 +0000221
Josh Bailey3f045a02012-03-24 08:35:20 -0700222 return circuit;
jardineb5d44e2003-12-23 08:09:43 +0000223}
224
225void
hassof891f442004-09-14 13:54:30 +0000226isis_circuit_add_addr (struct isis_circuit *circuit,
227 struct connected *connected)
jardineb5d44e2003-12-23 08:09:43 +0000228{
Josh Bailey3f045a02012-03-24 08:35:20 -0700229 struct listnode *node;
jardineb5d44e2003-12-23 08:09:43 +0000230 struct prefix_ipv4 *ipv4;
hassof390d2c2004-09-10 20:48:21 +0000231 u_char buf[BUFSIZ];
jardineb5d44e2003-12-23 08:09:43 +0000232#ifdef HAVE_IPV6
233 struct prefix_ipv6 *ipv6;
234#endif /* HAVE_IPV6 */
hassof891f442004-09-14 13:54:30 +0000235
jardineb5d44e2003-12-23 08:09:43 +0000236 memset (&buf, 0, BUFSIZ);
hassof891f442004-09-14 13:54:30 +0000237 if (connected->address->family == AF_INET)
hassof390d2c2004-09-10 20:48:21 +0000238 {
Josh Bailey3f045a02012-03-24 08:35:20 -0700239 u_int32_t addr = connected->address->u.prefix4.s_addr;
240 addr = ntohl (addr);
241 if (IPV4_NET0(addr) ||
242 IPV4_NET127(addr) ||
243 IN_CLASSD(addr) ||
244 IPV4_LINKLOCAL(addr))
245 return;
246
247 for (ALL_LIST_ELEMENTS_RO (circuit->ip_addrs, node, ipv4))
248 if (prefix_same ((struct prefix *) ipv4, connected->address))
249 return;
250
hassof390d2c2004-09-10 20:48:21 +0000251 ipv4 = prefix_ipv4_new ();
hassof891f442004-09-14 13:54:30 +0000252 ipv4->prefixlen = connected->address->prefixlen;
253 ipv4->prefix = connected->address->u.prefix4;
hassof390d2c2004-09-10 20:48:21 +0000254 listnode_add (circuit->ip_addrs, ipv4);
Olivier Dugeon4f593572016-04-19 19:03:05 +0200255
256 /* Update MPLS TE Local IP address parameter */
257 set_circuitparams_local_ipaddr (circuit->mtc, ipv4->prefix);
258
hasso0dae85e2004-09-26 19:53:47 +0000259 if (circuit->area)
Josh Bailey3f045a02012-03-24 08:35:20 -0700260 lsp_regenerate_schedule (circuit->area, circuit->is_type, 0);
hassof891f442004-09-14 13:54:30 +0000261
jardineb5d44e2003-12-23 08:09:43 +0000262#ifdef EXTREME_DEBUG
hassof891f442004-09-14 13:54:30 +0000263 prefix2str (connected->address, buf, BUFSIZ);
hasso529d65b2004-12-24 00:14:50 +0000264 zlog_debug ("Added IP address %s to circuit %d", buf,
hassof390d2c2004-09-10 20:48:21 +0000265 circuit->circuit_id);
266#endif /* EXTREME_DEBUG */
jardineb5d44e2003-12-23 08:09:43 +0000267 }
hassof390d2c2004-09-10 20:48:21 +0000268#ifdef HAVE_IPV6
hassof891f442004-09-14 13:54:30 +0000269 if (connected->address->family == AF_INET6)
hassof390d2c2004-09-10 20:48:21 +0000270 {
Josh Bailey3f045a02012-03-24 08:35:20 -0700271 if (IN6_IS_ADDR_LOOPBACK(&connected->address->u.prefix6))
272 return;
273
274 for (ALL_LIST_ELEMENTS_RO (circuit->ipv6_link, node, ipv6))
275 if (prefix_same ((struct prefix *) ipv6, connected->address))
276 return;
277 for (ALL_LIST_ELEMENTS_RO (circuit->ipv6_non_link, node, ipv6))
278 if (prefix_same ((struct prefix *) ipv6, connected->address))
279 return;
280
hassof390d2c2004-09-10 20:48:21 +0000281 ipv6 = prefix_ipv6_new ();
hassof891f442004-09-14 13:54:30 +0000282 ipv6->prefixlen = connected->address->prefixlen;
283 ipv6->prefix = connected->address->u.prefix6;
284
hassof390d2c2004-09-10 20:48:21 +0000285 if (IN6_IS_ADDR_LINKLOCAL (&ipv6->prefix))
hassof891f442004-09-14 13:54:30 +0000286 listnode_add (circuit->ipv6_link, ipv6);
hassof390d2c2004-09-10 20:48:21 +0000287 else
hassof891f442004-09-14 13:54:30 +0000288 listnode_add (circuit->ipv6_non_link, ipv6);
hasso0dae85e2004-09-26 19:53:47 +0000289 if (circuit->area)
Josh Bailey3f045a02012-03-24 08:35:20 -0700290 lsp_regenerate_schedule (circuit->area, circuit->is_type, 0);
hassof891f442004-09-14 13:54:30 +0000291
jardineb5d44e2003-12-23 08:09:43 +0000292#ifdef EXTREME_DEBUG
hassof891f442004-09-14 13:54:30 +0000293 prefix2str (connected->address, buf, BUFSIZ);
hasso529d65b2004-12-24 00:14:50 +0000294 zlog_debug ("Added IPv6 address %s to circuit %d", buf,
hassof390d2c2004-09-10 20:48:21 +0000295 circuit->circuit_id);
296#endif /* EXTREME_DEBUG */
297 }
jardineb5d44e2003-12-23 08:09:43 +0000298#endif /* HAVE_IPV6 */
jardineb5d44e2003-12-23 08:09:43 +0000299 return;
300}
301
302void
303isis_circuit_del_addr (struct isis_circuit *circuit,
hassof390d2c2004-09-10 20:48:21 +0000304 struct connected *connected)
jardineb5d44e2003-12-23 08:09:43 +0000305{
hassof891f442004-09-14 13:54:30 +0000306 struct prefix_ipv4 *ipv4, *ip = NULL;
307 struct listnode *node;
hassof891f442004-09-14 13:54:30 +0000308 u_char buf[BUFSIZ];
309#ifdef HAVE_IPV6
310 struct prefix_ipv6 *ipv6, *ip6 = NULL;
Paul Jakma41b36e92006-12-08 01:09:50 +0000311 int found = 0;
hassof891f442004-09-14 13:54:30 +0000312#endif /* HAVE_IPV6 */
jardineb5d44e2003-12-23 08:09:43 +0000313
hassof891f442004-09-14 13:54:30 +0000314 memset (&buf, 0, BUFSIZ);
315 if (connected->address->family == AF_INET)
316 {
317 ipv4 = prefix_ipv4_new ();
318 ipv4->prefixlen = connected->address->prefixlen;
319 ipv4->prefix = connected->address->u.prefix4;
320
paul1eb8ef22005-04-07 07:30:20 +0000321 for (ALL_LIST_ELEMENTS_RO (circuit->ip_addrs, node, ip))
Josh Bailey3f045a02012-03-24 08:35:20 -0700322 if (prefix_same ((struct prefix *) ip, (struct prefix *) ipv4))
paul1eb8ef22005-04-07 07:30:20 +0000323 break;
hassof891f442004-09-14 13:54:30 +0000324
325 if (ip)
326 {
327 listnode_delete (circuit->ip_addrs, ip);
Josh Bailey3f045a02012-03-24 08:35:20 -0700328 if (circuit->area)
329 lsp_regenerate_schedule (circuit->area, circuit->is_type, 0);
hassof891f442004-09-14 13:54:30 +0000330 }
331 else
332 {
hassof7c43dc2004-09-26 16:24:14 +0000333 prefix2str (connected->address, (char *)buf, BUFSIZ);
Josh Bailey3f045a02012-03-24 08:35:20 -0700334 zlog_warn ("Nonexitant ip address %s removal attempt from \
335 circuit %d", buf, circuit->circuit_id);
Christian Frankeec874162015-11-10 18:33:12 +0100336 zlog_warn ("Current ip addresses on %s:", circuit->interface->name);
337 for (ALL_LIST_ELEMENTS_RO(circuit->ip_addrs, node, ip))
338 {
339 prefix2str((struct prefix*)ip, (char *)buf, BUFSIZ);
340 zlog_warn(" %s", buf);
341 }
342 zlog_warn("End of addresses");
hassof891f442004-09-14 13:54:30 +0000343 }
David Lampartere8aca322012-11-27 01:10:30 +0000344
345 prefix_ipv4_free (ipv4);
hassof891f442004-09-14 13:54:30 +0000346 }
347#ifdef HAVE_IPV6
348 if (connected->address->family == AF_INET6)
349 {
350 ipv6 = prefix_ipv6_new ();
351 ipv6->prefixlen = connected->address->prefixlen;
352 ipv6->prefix = connected->address->u.prefix6;
353
354 if (IN6_IS_ADDR_LINKLOCAL (&ipv6->prefix))
355 {
paul1eb8ef22005-04-07 07:30:20 +0000356 for (ALL_LIST_ELEMENTS_RO (circuit->ipv6_link, node, ip6))
hassof891f442004-09-14 13:54:30 +0000357 {
hassof891f442004-09-14 13:54:30 +0000358 if (prefix_same ((struct prefix *) ip6, (struct prefix *) ipv6))
359 break;
360 }
361 if (ip6)
362 {
363 listnode_delete (circuit->ipv6_link, ip6);
364 found = 1;
365 }
366 }
367 else
368 {
paul1eb8ef22005-04-07 07:30:20 +0000369 for (ALL_LIST_ELEMENTS_RO (circuit->ipv6_non_link, node, ip6))
hassof891f442004-09-14 13:54:30 +0000370 {
hassof891f442004-09-14 13:54:30 +0000371 if (prefix_same ((struct prefix *) ip6, (struct prefix *) ipv6))
372 break;
373 }
374 if (ip6)
375 {
376 listnode_delete (circuit->ipv6_non_link, ip6);
377 found = 1;
378 }
379 }
380
381 if (!found)
382 {
hassof7c43dc2004-09-26 16:24:14 +0000383 prefix2str (connected->address, (char *)buf, BUFSIZ);
Josh Bailey3f045a02012-03-24 08:35:20 -0700384 zlog_warn ("Nonexitant ip address %s removal attempt from \
385 circuit %d", buf, circuit->circuit_id);
Christian Frankeec874162015-11-10 18:33:12 +0100386 zlog_warn ("Current ip addresses on %s:", circuit->interface->name);
387 for (ALL_LIST_ELEMENTS_RO(circuit->ipv6_link, node, ip6))
388 {
389 prefix2str((struct prefix*)ip6, (char *)buf, BUFSIZ);
390 zlog_warn(" %s", buf);
391 }
392 zlog_warn(" -----");
393 for (ALL_LIST_ELEMENTS_RO(circuit->ipv6_non_link, node, ip6))
394 {
395 prefix2str((struct prefix*)ip6, (char *)buf, BUFSIZ);
396 zlog_warn(" %s", buf);
397 }
398 zlog_warn("End of addresses");
hassof891f442004-09-14 13:54:30 +0000399 }
Josh Bailey3f045a02012-03-24 08:35:20 -0700400 else if (circuit->area)
401 lsp_regenerate_schedule (circuit->area, circuit->is_type, 0);
David Lampartere8aca322012-11-27 01:10:30 +0000402
403 prefix_ipv6_free (ipv6);
hassof891f442004-09-14 13:54:30 +0000404 }
405#endif /* HAVE_IPV6 */
406 return;
jardineb5d44e2003-12-23 08:09:43 +0000407}
408
Josh Bailey3f045a02012-03-24 08:35:20 -0700409static u_char
410isis_circuit_id_gen (struct interface *ifp)
411{
412 u_char id = 0;
413 char ifname[16];
414 unsigned int i;
415 int start = -1, end = -1;
416
417 /*
418 * Get a stable circuit id from ifname. This makes
419 * the ifindex from flapping when netdevs are created
420 * and deleted on the fly. Note that this circuit id
421 * is used in pseudo lsps so it is better to be stable.
422 * The following code works on any reasonanle ifname
423 * like: eth1 or trk-1.1 etc.
424 */
425 for (i = 0; i < strlen (ifp->name); i++)
426 {
David Lamparter52f02b42015-04-10 09:14:30 +0200427 if (isdigit((unsigned char)ifp->name[i]))
Josh Bailey3f045a02012-03-24 08:35:20 -0700428 {
429 if (start < 0)
430 {
431 start = i;
432 end = i + 1;
433 }
434 else
435 {
436 end = i + 1;
437 }
438 }
439 else if (start >= 0)
440 break;
441 }
442
443 if ((start >= 0) && (end >= start) && (end - start) < 16)
444 {
445 memset (ifname, 0, 16);
446 strncpy (ifname, &ifp->name[start], end - start);
447 id = (u_char)atoi(ifname);
448 }
449
450 /* Try to be unique. */
451 if (!id)
452 id = (u_char)((ifp->ifindex & 0xff) | 0x80);
453
454 return id;
455}
456
jardineb5d44e2003-12-23 08:09:43 +0000457void
458isis_circuit_if_add (struct isis_circuit *circuit, struct interface *ifp)
459{
paul1eb8ef22005-04-07 07:30:20 +0000460 struct listnode *node, *nnode;
jardineb5d44e2003-12-23 08:09:43 +0000461 struct connected *conn;
462
Josh Bailey3f045a02012-03-24 08:35:20 -0700463 circuit->circuit_id = isis_circuit_id_gen (ifp);
hassof390d2c2004-09-10 20:48:21 +0000464
Josh Bailey3f045a02012-03-24 08:35:20 -0700465 isis_circuit_if_bind (circuit, ifp);
jardineb5d44e2003-12-23 08:09:43 +0000466 /* isis_circuit_update_addrs (circuit, ifp); */
467
hassof390d2c2004-09-10 20:48:21 +0000468 if (if_is_broadcast (ifp))
469 {
Josh Bailey3f045a02012-03-24 08:35:20 -0700470 if (circuit->circ_type_config == CIRCUIT_T_P2P)
471 circuit->circ_type = CIRCUIT_T_P2P;
hassof390d2c2004-09-10 20:48:21 +0000472 else
Josh Bailey3f045a02012-03-24 08:35:20 -0700473 circuit->circ_type = CIRCUIT_T_BROADCAST;
hassof390d2c2004-09-10 20:48:21 +0000474 }
475 else if (if_is_pointopoint (ifp))
476 {
477 circuit->circ_type = CIRCUIT_T_P2P;
478 }
Josh Bailey3f045a02012-03-24 08:35:20 -0700479 else if (if_is_loopback (ifp))
480 {
481 circuit->circ_type = CIRCUIT_T_LOOPBACK;
482 circuit->is_passive = 1;
483 }
hassof390d2c2004-09-10 20:48:21 +0000484 else
485 {
hassoc89c05d2005-09-04 21:36:36 +0000486 /* It's normal in case of loopback etc. */
487 if (isis->debugs & DEBUG_EVENTS)
Josh Bailey3f045a02012-03-24 08:35:20 -0700488 zlog_debug ("isis_circuit_if_add: unsupported media");
489 circuit->circ_type = CIRCUIT_T_UNKNOWN;
hassof390d2c2004-09-10 20:48:21 +0000490 }
491
Josh Bailey3f045a02012-03-24 08:35:20 -0700492 circuit->ip_addrs = list_new ();
493#ifdef HAVE_IPV6
494 circuit->ipv6_link = list_new ();
495 circuit->ipv6_non_link = list_new ();
496#endif /* HAVE_IPV6 */
497
paul1eb8ef22005-04-07 07:30:20 +0000498 for (ALL_LIST_ELEMENTS (ifp->connected, node, nnode, conn))
499 isis_circuit_add_addr (circuit, conn);
jardineb5d44e2003-12-23 08:09:43 +0000500
501 return;
502}
503
504void
Josh Bailey3f045a02012-03-24 08:35:20 -0700505isis_circuit_if_del (struct isis_circuit *circuit, struct interface *ifp)
jardineb5d44e2003-12-23 08:09:43 +0000506{
Josh Bailey3f045a02012-03-24 08:35:20 -0700507 struct listnode *node, *nnode;
508 struct connected *conn;
hassof390d2c2004-09-10 20:48:21 +0000509
Josh Bailey3f045a02012-03-24 08:35:20 -0700510 assert (circuit->interface == ifp);
511
512 /* destroy addresses */
513 for (ALL_LIST_ELEMENTS (ifp->connected, node, nnode, conn))
514 isis_circuit_del_addr (circuit, conn);
515
516 if (circuit->ip_addrs)
hassof390d2c2004-09-10 20:48:21 +0000517 {
Josh Bailey3f045a02012-03-24 08:35:20 -0700518 assert (listcount(circuit->ip_addrs) == 0);
519 list_delete (circuit->ip_addrs);
520 circuit->ip_addrs = NULL;
hassof390d2c2004-09-10 20:48:21 +0000521 }
jardineb5d44e2003-12-23 08:09:43 +0000522
Josh Bailey3f045a02012-03-24 08:35:20 -0700523#ifdef HAVE_IPV6
524 if (circuit->ipv6_link)
hassof390d2c2004-09-10 20:48:21 +0000525 {
Josh Bailey3f045a02012-03-24 08:35:20 -0700526 assert (listcount(circuit->ipv6_link) == 0);
527 list_delete (circuit->ipv6_link);
528 circuit->ipv6_link = NULL;
jardineb5d44e2003-12-23 08:09:43 +0000529 }
jardineb5d44e2003-12-23 08:09:43 +0000530
Josh Bailey3f045a02012-03-24 08:35:20 -0700531 if (circuit->ipv6_non_link)
hassof390d2c2004-09-10 20:48:21 +0000532 {
Josh Bailey3f045a02012-03-24 08:35:20 -0700533 assert (listcount(circuit->ipv6_non_link) == 0);
534 list_delete (circuit->ipv6_non_link);
535 circuit->ipv6_non_link = NULL;
hassof390d2c2004-09-10 20:48:21 +0000536 }
Josh Bailey3f045a02012-03-24 08:35:20 -0700537#endif /* HAVE_IPV6 */
538
539 circuit->circ_type = CIRCUIT_T_UNKNOWN;
540 circuit->circuit_id = 0;
jardineb5d44e2003-12-23 08:09:43 +0000541
jardineb5d44e2003-12-23 08:09:43 +0000542 return;
543}
544
545void
Josh Bailey3f045a02012-03-24 08:35:20 -0700546isis_circuit_if_bind (struct isis_circuit *circuit, struct interface *ifp)
jardineb5d44e2003-12-23 08:09:43 +0000547{
Josh Bailey3f045a02012-03-24 08:35:20 -0700548 assert (circuit != NULL);
549 assert (ifp != NULL);
550 if (circuit->interface)
551 assert (circuit->interface == ifp);
552 else
553 circuit->interface = ifp;
554 if (ifp->info)
555 assert (ifp->info == circuit);
556 else
557 ifp->info = circuit;
Olivier Dugeon4f593572016-04-19 19:03:05 +0200558 isis_link_params_update (circuit, ifp);
Josh Bailey3f045a02012-03-24 08:35:20 -0700559}
560
561void
562isis_circuit_if_unbind (struct isis_circuit *circuit, struct interface *ifp)
563{
564 assert (circuit != NULL);
565 assert (ifp != NULL);
566 assert (circuit->interface == ifp);
567 assert (ifp->info == circuit);
jardineb5d44e2003-12-23 08:09:43 +0000568 circuit->interface = NULL;
Josh Bailey3f045a02012-03-24 08:35:20 -0700569 ifp->info = NULL;
jardineb5d44e2003-12-23 08:09:43 +0000570}
571
Josh Bailey3f045a02012-03-24 08:35:20 -0700572static void
573isis_circuit_update_all_srmflags (struct isis_circuit *circuit, int is_set)
574{
575 struct isis_area *area;
576 struct isis_lsp *lsp;
577 dnode_t *dnode, *dnode_next;
578 int level;
579
580 assert (circuit);
581 area = circuit->area;
582 assert (area);
583 for (level = ISIS_LEVEL1; level <= ISIS_LEVEL2; level++)
584 {
585 if (level & circuit->is_type)
586 {
587 if (area->lspdb[level - 1] &&
588 dict_count (area->lspdb[level - 1]) > 0)
589 {
590 for (dnode = dict_first (area->lspdb[level - 1]);
591 dnode != NULL; dnode = dnode_next)
592 {
593 dnode_next = dict_next (area->lspdb[level - 1], dnode);
594 lsp = dnode_get (dnode);
595 if (is_set)
596 {
597 ISIS_SET_FLAG (lsp->SRMflags, circuit);
598 }
599 else
600 {
601 ISIS_CLEAR_FLAG (lsp->SRMflags, circuit);
602 }
603 }
604 }
605 }
606 }
607}
608
Christian Frankef1fc1db2015-11-10 18:43:31 +0100609size_t
610isis_circuit_pdu_size(struct isis_circuit *circuit)
611{
612 return ISO_MTU(circuit);
613}
614
615void
616isis_circuit_stream(struct isis_circuit *circuit, struct stream **stream)
617{
618 size_t stream_size = isis_circuit_pdu_size(circuit);
619
620 if (!*stream)
621 {
622 *stream = stream_new(stream_size);
623 }
624 else
625 {
626 if (STREAM_SIZE(*stream) != stream_size)
627 stream_resize(*stream, stream_size);
628 stream_reset(*stream);
629 }
630}
631
Josh Bailey3f045a02012-03-24 08:35:20 -0700632int
jardineb5d44e2003-12-23 08:09:43 +0000633isis_circuit_up (struct isis_circuit *circuit)
634{
Josh Bailey3f045a02012-03-24 08:35:20 -0700635 int retv;
636
637 /* Set the flags for all the lsps of the circuit. */
638 isis_circuit_update_all_srmflags (circuit, 1);
639
640 if (circuit->state == C_STATE_UP)
641 return ISIS_OK;
642
643 if (circuit->is_passive)
644 return ISIS_OK;
jardineb5d44e2003-12-23 08:09:43 +0000645
Christian Frankef1fc1db2015-11-10 18:43:31 +0100646 if (circuit->area->lsp_mtu > isis_circuit_pdu_size(circuit))
647 {
648 zlog_err("Interface MTU %zu on %s is too low to support area lsp mtu %u!",
649 isis_circuit_pdu_size(circuit), circuit->interface->name,
650 circuit->area->lsp_mtu);
Christian Franke8ed8d0b2016-04-03 12:46:26 -0300651 isis_circuit_update_all_srmflags(circuit, 0);
Christian Frankef1fc1db2015-11-10 18:43:31 +0100652 return ISIS_ERROR;
653 }
654
hassof390d2c2004-09-10 20:48:21 +0000655 if (circuit->circ_type == CIRCUIT_T_BROADCAST)
656 {
Josh Bailey3f045a02012-03-24 08:35:20 -0700657 /*
658 * Get the Hardware Address
659 */
Josh Bailey3f045a02012-03-24 08:35:20 -0700660 if (circuit->interface->hw_addr_len != ETH_ALEN)
661 {
662 zlog_warn ("unsupported link layer");
663 }
664 else
665 {
666 memcpy (circuit->u.bc.snpa, circuit->interface->hw_addr, ETH_ALEN);
667 }
668#ifdef EXTREME_DEGUG
669 zlog_debug ("isis_circuit_if_add: if_id %d, isomtu %d snpa %s",
670 circuit->interface->ifindex, ISO_MTU (circuit),
671 snpa_print (circuit->u.bc.snpa));
672#endif /* EXTREME_DEBUG */
Josh Bailey3f045a02012-03-24 08:35:20 -0700673
674 circuit->u.bc.adjdb[0] = list_new ();
675 circuit->u.bc.adjdb[1] = list_new ();
676
hassof390d2c2004-09-10 20:48:21 +0000677 /*
678 * ISO 10589 - 8.4.1 Enabling of broadcast circuits
679 */
jardineb5d44e2003-12-23 08:09:43 +0000680
hassof390d2c2004-09-10 20:48:21 +0000681 /* initilizing the hello sending threads
682 * for a broadcast IF
683 */
jardineb5d44e2003-12-23 08:09:43 +0000684
hassof390d2c2004-09-10 20:48:21 +0000685 /* 8.4.1 a) commence sending of IIH PDUs */
686
Josh Bailey3f045a02012-03-24 08:35:20 -0700687 if (circuit->is_type & IS_LEVEL_1)
688 {
689 thread_add_event (master, send_lan_l1_hello, circuit, 0);
690 circuit->u.bc.lan_neighs[0] = list_new ();
691 }
hassof390d2c2004-09-10 20:48:21 +0000692
Josh Bailey3f045a02012-03-24 08:35:20 -0700693 if (circuit->is_type & IS_LEVEL_2)
694 {
695 thread_add_event (master, send_lan_l2_hello, circuit, 0);
696 circuit->u.bc.lan_neighs[1] = list_new ();
697 }
hassof390d2c2004-09-10 20:48:21 +0000698
699 /* 8.4.1 b) FIXME: solicit ES - 8.4.6 */
700 /* 8.4.1 c) FIXME: listen for ESH PDUs */
701
702 /* 8.4.1 d) */
703 /* dr election will commence in... */
Josh Bailey3f045a02012-03-24 08:35:20 -0700704 if (circuit->is_type & IS_LEVEL_1)
705 THREAD_TIMER_ON (master, circuit->u.bc.t_run_dr[0], isis_run_dr_l1,
706 circuit, 2 * circuit->hello_interval[0]);
707 if (circuit->is_type & IS_LEVEL_2)
708 THREAD_TIMER_ON (master, circuit->u.bc.t_run_dr[1], isis_run_dr_l2,
709 circuit, 2 * circuit->hello_interval[1]);
jardineb5d44e2003-12-23 08:09:43 +0000710 }
hassof390d2c2004-09-10 20:48:21 +0000711 else
712 {
713 /* initializing the hello send threads
714 * for a ptp IF
715 */
Josh Bailey3f045a02012-03-24 08:35:20 -0700716 circuit->u.p2p.neighbor = NULL;
hassof390d2c2004-09-10 20:48:21 +0000717 thread_add_event (master, send_p2p_hello, circuit, 0);
jardineb5d44e2003-12-23 08:09:43 +0000718 }
719
jardineb5d44e2003-12-23 08:09:43 +0000720 /* initializing PSNP timers */
Josh Bailey3f045a02012-03-24 08:35:20 -0700721 if (circuit->is_type & IS_LEVEL_1)
722 THREAD_TIMER_ON (master, circuit->t_send_psnp[0], send_l1_psnp, circuit,
723 isis_jitter (circuit->psnp_interval[0], PSNP_JITTER));
724
725 if (circuit->is_type & IS_LEVEL_2)
726 THREAD_TIMER_ON (master, circuit->t_send_psnp[1], send_l2_psnp, circuit,
727 isis_jitter (circuit->psnp_interval[1], PSNP_JITTER));
728
729 /* unified init for circuits; ignore warnings below this level */
730 retv = isis_sock_init (circuit);
731 if (retv != ISIS_OK)
hassof390d2c2004-09-10 20:48:21 +0000732 {
Josh Bailey3f045a02012-03-24 08:35:20 -0700733 isis_circuit_down (circuit);
734 return retv;
hassof390d2c2004-09-10 20:48:21 +0000735 }
736
Josh Bailey3f045a02012-03-24 08:35:20 -0700737 /* initialize the circuit streams after opening connection */
Christian Frankef1fc1db2015-11-10 18:43:31 +0100738 isis_circuit_stream(circuit, &circuit->rcv_stream);
739 isis_circuit_stream(circuit, &circuit->snd_stream);
jardineb5d44e2003-12-23 08:09:43 +0000740
jardineb5d44e2003-12-23 08:09:43 +0000741#ifdef GNU_LINUX
hassof390d2c2004-09-10 20:48:21 +0000742 THREAD_READ_ON (master, circuit->t_read, isis_receive, circuit,
Josh Bailey3f045a02012-03-24 08:35:20 -0700743 circuit->fd);
jardineb5d44e2003-12-23 08:09:43 +0000744#else
hassof390d2c2004-09-10 20:48:21 +0000745 THREAD_TIMER_ON (master, circuit->t_read, isis_receive, circuit,
Josh Bailey3f045a02012-03-24 08:35:20 -0700746 circuit->fd);
jardineb5d44e2003-12-23 08:09:43 +0000747#endif
Josh Bailey3f045a02012-03-24 08:35:20 -0700748
749 circuit->lsp_queue = list_new ();
750 circuit->lsp_queue_last_cleared = time (NULL);
751
752 return ISIS_OK;
jardineb5d44e2003-12-23 08:09:43 +0000753}
754
755void
756isis_circuit_down (struct isis_circuit *circuit)
757{
Josh Bailey3f045a02012-03-24 08:35:20 -0700758 if (circuit->state != C_STATE_UP)
759 return;
760
761 /* Clear the flags for all the lsps of the circuit. */
762 isis_circuit_update_all_srmflags (circuit, 0);
763
hassof390d2c2004-09-10 20:48:21 +0000764 if (circuit->circ_type == CIRCUIT_T_BROADCAST)
765 {
Josh Bailey3f045a02012-03-24 08:35:20 -0700766 /* destroy neighbour lists */
767 if (circuit->u.bc.lan_neighs[0])
768 {
769 list_delete (circuit->u.bc.lan_neighs[0]);
770 circuit->u.bc.lan_neighs[0] = NULL;
771 }
772 if (circuit->u.bc.lan_neighs[1])
773 {
774 list_delete (circuit->u.bc.lan_neighs[1]);
775 circuit->u.bc.lan_neighs[1] = NULL;
776 }
777 /* destroy adjacency databases */
778 if (circuit->u.bc.adjdb[0])
779 {
780 circuit->u.bc.adjdb[0]->del = isis_delete_adj;
781 list_delete (circuit->u.bc.adjdb[0]);
782 circuit->u.bc.adjdb[0] = NULL;
783 }
784 if (circuit->u.bc.adjdb[1])
785 {
786 circuit->u.bc.adjdb[1]->del = isis_delete_adj;
787 list_delete (circuit->u.bc.adjdb[1]);
788 circuit->u.bc.adjdb[1] = NULL;
789 }
790 if (circuit->u.bc.is_dr[0])
791 {
792 isis_dr_resign (circuit, 1);
793 circuit->u.bc.is_dr[0] = 0;
794 }
795 memset (circuit->u.bc.l1_desig_is, 0, ISIS_SYS_ID_LEN + 1);
796 if (circuit->u.bc.is_dr[1])
797 {
798 isis_dr_resign (circuit, 2);
799 circuit->u.bc.is_dr[1] = 0;
800 }
801 memset (circuit->u.bc.l2_desig_is, 0, ISIS_SYS_ID_LEN + 1);
802 memset (circuit->u.bc.snpa, 0, ETH_ALEN);
803
hassof390d2c2004-09-10 20:48:21 +0000804 THREAD_TIMER_OFF (circuit->u.bc.t_send_lan_hello[0]);
805 THREAD_TIMER_OFF (circuit->u.bc.t_send_lan_hello[1]);
hassof891f442004-09-14 13:54:30 +0000806 THREAD_TIMER_OFF (circuit->u.bc.t_run_dr[0]);
807 THREAD_TIMER_OFF (circuit->u.bc.t_run_dr[1]);
Josh Bailey3f045a02012-03-24 08:35:20 -0700808 THREAD_TIMER_OFF (circuit->u.bc.t_refresh_pseudo_lsp[0]);
809 THREAD_TIMER_OFF (circuit->u.bc.t_refresh_pseudo_lsp[1]);
Christian Franke61010c32015-11-10 18:43:34 +0100810 circuit->lsp_regenerate_pending[0] = 0;
811 circuit->lsp_regenerate_pending[1] = 0;
hassof390d2c2004-09-10 20:48:21 +0000812 }
813 else if (circuit->circ_type == CIRCUIT_T_P2P)
814 {
Josh Bailey3f045a02012-03-24 08:35:20 -0700815 isis_delete_adj (circuit->u.p2p.neighbor);
816 circuit->u.p2p.neighbor = NULL;
hassof390d2c2004-09-10 20:48:21 +0000817 THREAD_TIMER_OFF (circuit->u.p2p.t_send_p2p_hello);
818 }
Josh Bailey3f045a02012-03-24 08:35:20 -0700819
820 /* Cancel all active threads */
821 THREAD_TIMER_OFF (circuit->t_send_csnp[0]);
822 THREAD_TIMER_OFF (circuit->t_send_csnp[1]);
823 THREAD_TIMER_OFF (circuit->t_send_psnp[0]);
824 THREAD_TIMER_OFF (circuit->t_send_psnp[1]);
825 THREAD_OFF (circuit->t_read);
826
827 if (circuit->lsp_queue)
828 {
829 circuit->lsp_queue->del = NULL;
830 list_delete (circuit->lsp_queue);
831 circuit->lsp_queue = NULL;
832 }
833
834 /* send one gratuitous hello to spead up convergence */
835 if (circuit->is_type & IS_LEVEL_1)
836 send_hello (circuit, IS_LEVEL_1);
837 if (circuit->is_type & IS_LEVEL_2)
838 send_hello (circuit, IS_LEVEL_2);
839
840 circuit->upadjcount[0] = 0;
841 circuit->upadjcount[1] = 0;
842
jardineb5d44e2003-12-23 08:09:43 +0000843 /* close the socket */
Josh Bailey3f045a02012-03-24 08:35:20 -0700844 if (circuit->fd)
845 {
846 close (circuit->fd);
847 circuit->fd = 0;
848 }
849
850 if (circuit->rcv_stream != NULL)
851 {
852 stream_free (circuit->rcv_stream);
853 circuit->rcv_stream = NULL;
854 }
855
856 if (circuit->snd_stream != NULL)
857 {
858 stream_free (circuit->snd_stream);
859 circuit->snd_stream = NULL;
860 }
861
862 thread_cancel_event (master, circuit);
jardineb5d44e2003-12-23 08:09:43 +0000863
864 return;
865}
866
867void
868circuit_update_nlpids (struct isis_circuit *circuit)
869{
870 circuit->nlpids.count = 0;
hassof390d2c2004-09-10 20:48:21 +0000871
872 if (circuit->ip_router)
873 {
874 circuit->nlpids.nlpids[0] = NLPID_IP;
875 circuit->nlpids.count++;
876 }
jardineb5d44e2003-12-23 08:09:43 +0000877#ifdef HAVE_IPV6
hassof390d2c2004-09-10 20:48:21 +0000878 if (circuit->ipv6_router)
879 {
880 circuit->nlpids.nlpids[circuit->nlpids.count] = NLPID_IPV6;
881 circuit->nlpids.count++;
882 }
jardineb5d44e2003-12-23 08:09:43 +0000883#endif /* HAVE_IPV6 */
884 return;
885}
886
Josh Bailey3f045a02012-03-24 08:35:20 -0700887void
888isis_circuit_print_vty (struct isis_circuit *circuit, struct vty *vty,
889 char detail)
890{
891 if (detail == ISIS_UI_LEVEL_BRIEF)
892 {
893 vty_out (vty, " %-12s", circuit->interface->name);
894 vty_out (vty, "0x%-7x", circuit->circuit_id);
895 vty_out (vty, "%-9s", circuit_state2string (circuit->state));
896 vty_out (vty, "%-9s", circuit_type2string (circuit->circ_type));
897 vty_out (vty, "%-9s", circuit_t2string (circuit->is_type));
898 vty_out (vty, "%s", VTY_NEWLINE);
899 }
900
901 if (detail == ISIS_UI_LEVEL_DETAIL)
902 {
Christian Frankecb32a192015-11-10 18:33:13 +0100903 struct listnode *node;
904 struct prefix *ip_addr;
905 u_char buf[BUFSIZ];
906
Josh Bailey3f045a02012-03-24 08:35:20 -0700907 vty_out (vty, " Interface: %s", circuit->interface->name);
908 vty_out (vty, ", State: %s", circuit_state2string (circuit->state));
909 if (circuit->is_passive)
910 vty_out (vty, ", Passive");
911 else
912 vty_out (vty, ", Active");
913 vty_out (vty, ", Circuit Id: 0x%x", circuit->circuit_id);
914 vty_out (vty, "%s", VTY_NEWLINE);
915 vty_out (vty, " Type: %s", circuit_type2string (circuit->circ_type));
916 vty_out (vty, ", Level: %s", circuit_t2string (circuit->is_type));
917 if (circuit->circ_type == CIRCUIT_T_BROADCAST)
918 vty_out (vty, ", SNPA: %-10s", snpa_print (circuit->u.bc.snpa));
919 vty_out (vty, "%s", VTY_NEWLINE);
920 if (circuit->is_type & IS_LEVEL_1)
921 {
922 vty_out (vty, " Level-1 Information:%s", VTY_NEWLINE);
923 if (circuit->area->newmetric)
924 vty_out (vty, " Metric: %d", circuit->te_metric[0]);
925 else
926 vty_out (vty, " Metric: %d",
927 circuit->metrics[0].metric_default);
928 if (!circuit->is_passive)
929 {
930 vty_out (vty, ", Active neighbors: %u%s",
931 circuit->upadjcount[0], VTY_NEWLINE);
932 vty_out (vty, " Hello interval: %u, "
933 "Holddown count: %u %s%s",
934 circuit->hello_interval[0],
935 circuit->hello_multiplier[0],
936 (circuit->pad_hellos ? "(pad)" : "(no-pad)"),
937 VTY_NEWLINE);
938 vty_out (vty, " CNSP interval: %u, "
939 "PSNP interval: %u%s",
940 circuit->csnp_interval[0],
941 circuit->psnp_interval[0], VTY_NEWLINE);
942 if (circuit->circ_type == CIRCUIT_T_BROADCAST)
943 vty_out (vty, " LAN Priority: %u, %s%s",
944 circuit->priority[0],
945 (circuit->u.bc.is_dr[0] ? \
946 "is DIS" : "is not DIS"), VTY_NEWLINE);
947 }
948 else
949 {
950 vty_out (vty, "%s", VTY_NEWLINE);
951 }
952 }
953 if (circuit->is_type & IS_LEVEL_2)
954 {
955 vty_out (vty, " Level-2 Information:%s", VTY_NEWLINE);
956 if (circuit->area->newmetric)
957 vty_out (vty, " Metric: %d", circuit->te_metric[1]);
958 else
959 vty_out (vty, " Metric: %d",
960 circuit->metrics[1].metric_default);
961 if (!circuit->is_passive)
962 {
963 vty_out (vty, ", Active neighbors: %u%s",
964 circuit->upadjcount[1], VTY_NEWLINE);
965 vty_out (vty, " Hello interval: %u, "
966 "Holddown count: %u %s%s",
967 circuit->hello_interval[1],
968 circuit->hello_multiplier[1],
969 (circuit->pad_hellos ? "(pad)" : "(no-pad)"),
970 VTY_NEWLINE);
971 vty_out (vty, " CNSP interval: %u, "
972 "PSNP interval: %u%s",
973 circuit->csnp_interval[1],
974 circuit->psnp_interval[1], VTY_NEWLINE);
975 if (circuit->circ_type == CIRCUIT_T_BROADCAST)
976 vty_out (vty, " LAN Priority: %u, %s%s",
977 circuit->priority[1],
978 (circuit->u.bc.is_dr[1] ? \
979 "is DIS" : "is not DIS"), VTY_NEWLINE);
980 }
981 else
982 {
983 vty_out (vty, "%s", VTY_NEWLINE);
984 }
985 }
986 if (circuit->ip_addrs && listcount (circuit->ip_addrs) > 0)
987 {
Josh Bailey3f045a02012-03-24 08:35:20 -0700988 vty_out (vty, " IP Prefix(es):%s", VTY_NEWLINE);
989 for (ALL_LIST_ELEMENTS_RO (circuit->ip_addrs, node, ip_addr))
990 {
991 prefix2str (ip_addr, (char*)buf, BUFSIZ),
992 vty_out (vty, " %s%s", buf, VTY_NEWLINE);
993 }
994 }
Christian Frankecb32a192015-11-10 18:33:13 +0100995 if (circuit->ipv6_link && listcount(circuit->ipv6_link) > 0)
996 {
997 vty_out(vty, " IPv6 Link-Locals:%s", VTY_NEWLINE);
998 for (ALL_LIST_ELEMENTS_RO(circuit->ipv6_link, node, ip_addr))
999 {
1000 prefix2str(ip_addr, (char*)buf, BUFSIZ),
1001 vty_out(vty, " %s%s", buf, VTY_NEWLINE);
1002 }
1003 }
1004 if (circuit->ipv6_link && listcount(circuit->ipv6_non_link) > 0)
1005 {
1006 vty_out(vty, " IPv6 Prefixes:%s", VTY_NEWLINE);
1007 for (ALL_LIST_ELEMENTS_RO(circuit->ipv6_non_link, node, ip_addr))
1008 {
1009 prefix2str(ip_addr, (char*)buf, BUFSIZ),
1010 vty_out(vty, " %s%s", buf, VTY_NEWLINE);
1011 }
1012 }
1013
Josh Bailey3f045a02012-03-24 08:35:20 -07001014 vty_out (vty, "%s", VTY_NEWLINE);
1015 }
1016 return;
1017}
1018
jardineb5d44e2003-12-23 08:09:43 +00001019int
hassof390d2c2004-09-10 20:48:21 +00001020isis_interface_config_write (struct vty *vty)
jardineb5d44e2003-12-23 08:09:43 +00001021{
jardineb5d44e2003-12-23 08:09:43 +00001022 int write = 0;
hasso3fdb2dd2005-09-28 18:45:54 +00001023 struct listnode *node, *node2;
jardineb5d44e2003-12-23 08:09:43 +00001024 struct interface *ifp;
1025 struct isis_area *area;
Josh Bailey3f045a02012-03-24 08:35:20 -07001026 struct isis_circuit *circuit;
jardineb5d44e2003-12-23 08:09:43 +00001027 int i;
jardineb5d44e2003-12-23 08:09:43 +00001028
hasso3fdb2dd2005-09-28 18:45:54 +00001029 for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
jardineb5d44e2003-12-23 08:09:43 +00001030 {
Josh Bailey3f045a02012-03-24 08:35:20 -07001031 /* IF name */
1032 vty_out (vty, "interface %s%s", ifp->name, VTY_NEWLINE);
1033 write++;
1034 /* IF desc */
1035 if (ifp->desc)
1036 {
1037 vty_out (vty, " description %s%s", ifp->desc, VTY_NEWLINE);
1038 write++;
1039 }
1040 /* ISIS Circuit */
1041 for (ALL_LIST_ELEMENTS_RO (isis->area_list, node2, area))
1042 {
1043 circuit = circuit_lookup_by_ifp (ifp, area->circuit_list);
1044 if (circuit == NULL)
1045 continue;
1046 if (circuit->ip_router)
1047 {
1048 vty_out (vty, " ip router isis %s%s", area->area_tag,
1049 VTY_NEWLINE);
1050 write++;
1051 }
1052 if (circuit->is_passive)
1053 {
1054 vty_out (vty, " isis passive%s", VTY_NEWLINE);
1055 write++;
1056 }
1057 if (circuit->circ_type_config == CIRCUIT_T_P2P)
1058 {
1059 vty_out (vty, " isis network point-to-point%s", VTY_NEWLINE);
1060 write++;
1061 }
jardineb5d44e2003-12-23 08:09:43 +00001062#ifdef HAVE_IPV6
Josh Bailey3f045a02012-03-24 08:35:20 -07001063 if (circuit->ipv6_router)
1064 {
1065 vty_out (vty, " ipv6 router isis %s%s", area->area_tag,
1066 VTY_NEWLINE);
1067 write++;
1068 }
jardineb5d44e2003-12-23 08:09:43 +00001069#endif /* HAVE_IPV6 */
jardineb5d44e2003-12-23 08:09:43 +00001070
Josh Bailey3f045a02012-03-24 08:35:20 -07001071 /* ISIS - circuit type */
1072 if (circuit->is_type == IS_LEVEL_1)
1073 {
1074 vty_out (vty, " isis circuit-type level-1%s", VTY_NEWLINE);
1075 write++;
1076 }
1077 else
1078 {
1079 if (circuit->is_type == IS_LEVEL_2)
1080 {
1081 vty_out (vty, " isis circuit-type level-2-only%s",
1082 VTY_NEWLINE);
1083 write++;
1084 }
1085 }
jardineb5d44e2003-12-23 08:09:43 +00001086
Josh Bailey3f045a02012-03-24 08:35:20 -07001087 /* ISIS - CSNP interval */
1088 if (circuit->csnp_interval[0] == circuit->csnp_interval[1])
1089 {
1090 if (circuit->csnp_interval[0] != DEFAULT_CSNP_INTERVAL)
1091 {
1092 vty_out (vty, " isis csnp-interval %d%s",
1093 circuit->csnp_interval[0], VTY_NEWLINE);
1094 write++;
1095 }
1096 }
1097 else
1098 {
1099 for (i = 0; i < 2; i++)
1100 {
1101 if (circuit->csnp_interval[i] != DEFAULT_CSNP_INTERVAL)
1102 {
1103 vty_out (vty, " isis csnp-interval %d level-%d%s",
1104 circuit->csnp_interval[i], i + 1, VTY_NEWLINE);
1105 write++;
1106 }
1107 }
1108 }
jardineb5d44e2003-12-23 08:09:43 +00001109
Josh Bailey3f045a02012-03-24 08:35:20 -07001110 /* ISIS - PSNP interval */
1111 if (circuit->psnp_interval[0] == circuit->psnp_interval[1])
1112 {
1113 if (circuit->psnp_interval[0] != DEFAULT_PSNP_INTERVAL)
1114 {
1115 vty_out (vty, " isis psnp-interval %d%s",
1116 circuit->psnp_interval[0], VTY_NEWLINE);
1117 write++;
1118 }
1119 }
1120 else
1121 {
1122 for (i = 0; i < 2; i++)
1123 {
1124 if (circuit->psnp_interval[i] != DEFAULT_PSNP_INTERVAL)
1125 {
1126 vty_out (vty, " isis psnp-interval %d level-%d%s",
1127 circuit->psnp_interval[i], i + 1, VTY_NEWLINE);
1128 write++;
1129 }
1130 }
1131 }
jardineb5d44e2003-12-23 08:09:43 +00001132
Josh Bailey3f045a02012-03-24 08:35:20 -07001133 /* ISIS - Hello padding - Defaults to true so only display if false */
1134 if (circuit->pad_hellos == 0)
1135 {
1136 vty_out (vty, " no isis hello padding%s", VTY_NEWLINE);
1137 write++;
1138 }
jardineb5d44e2003-12-23 08:09:43 +00001139
Josh Bailey3f045a02012-03-24 08:35:20 -07001140 /* ISIS - Hello interval */
1141 if (circuit->hello_interval[0] == circuit->hello_interval[1])
1142 {
1143 if (circuit->hello_interval[0] != DEFAULT_HELLO_INTERVAL)
1144 {
1145 vty_out (vty, " isis hello-interval %d%s",
1146 circuit->hello_interval[0], VTY_NEWLINE);
1147 write++;
1148 }
1149 }
1150 else
1151 {
1152 for (i = 0; i < 2; i++)
1153 {
1154 if (circuit->hello_interval[i] != DEFAULT_HELLO_INTERVAL)
1155 {
1156 vty_out (vty, " isis hello-interval %d level-%d%s",
1157 circuit->hello_interval[i], i + 1, VTY_NEWLINE);
1158 write++;
1159 }
1160 }
1161 }
jardineb5d44e2003-12-23 08:09:43 +00001162
Josh Bailey3f045a02012-03-24 08:35:20 -07001163 /* ISIS - Hello Multiplier */
1164 if (circuit->hello_multiplier[0] == circuit->hello_multiplier[1])
1165 {
1166 if (circuit->hello_multiplier[0] != DEFAULT_HELLO_MULTIPLIER)
1167 {
1168 vty_out (vty, " isis hello-multiplier %d%s",
1169 circuit->hello_multiplier[0], VTY_NEWLINE);
1170 write++;
1171 }
1172 }
1173 else
1174 {
1175 for (i = 0; i < 2; i++)
1176 {
1177 if (circuit->hello_multiplier[i] != DEFAULT_HELLO_MULTIPLIER)
1178 {
1179 vty_out (vty, " isis hello-multiplier %d level-%d%s",
1180 circuit->hello_multiplier[i], i + 1,
1181 VTY_NEWLINE);
1182 write++;
1183 }
1184 }
1185 }
1186
1187 /* ISIS - Priority */
1188 if (circuit->priority[0] == circuit->priority[1])
1189 {
1190 if (circuit->priority[0] != DEFAULT_PRIORITY)
1191 {
1192 vty_out (vty, " isis priority %d%s",
1193 circuit->priority[0], VTY_NEWLINE);
1194 write++;
1195 }
1196 }
1197 else
1198 {
1199 for (i = 0; i < 2; i++)
1200 {
1201 if (circuit->priority[i] != DEFAULT_PRIORITY)
1202 {
1203 vty_out (vty, " isis priority %d level-%d%s",
1204 circuit->priority[i], i + 1, VTY_NEWLINE);
1205 write++;
1206 }
1207 }
1208 }
1209
1210 /* ISIS - Metric */
1211 if (circuit->te_metric[0] == circuit->te_metric[1])
1212 {
1213 if (circuit->te_metric[0] != DEFAULT_CIRCUIT_METRIC)
1214 {
1215 vty_out (vty, " isis metric %d%s", circuit->te_metric[0],
1216 VTY_NEWLINE);
1217 write++;
1218 }
1219 }
1220 else
1221 {
1222 for (i = 0; i < 2; i++)
1223 {
1224 if (circuit->te_metric[i] != DEFAULT_CIRCUIT_METRIC)
1225 {
1226 vty_out (vty, " isis metric %d level-%d%s",
1227 circuit->te_metric[i], i + 1, VTY_NEWLINE);
1228 write++;
1229 }
1230 }
1231 }
1232 if (circuit->passwd.type == ISIS_PASSWD_TYPE_HMAC_MD5)
1233 {
1234 vty_out (vty, " isis password md5 %s%s", circuit->passwd.passwd,
1235 VTY_NEWLINE);
1236 write++;
1237 }
1238 else if (circuit->passwd.type == ISIS_PASSWD_TYPE_CLEARTXT)
1239 {
1240 vty_out (vty, " isis password clear %s%s", circuit->passwd.passwd,
1241 VTY_NEWLINE);
1242 write++;
1243 }
1244 }
1245 vty_out (vty, "!%s", VTY_NEWLINE);
jardineb5d44e2003-12-23 08:09:43 +00001246 }
hassof390d2c2004-09-10 20:48:21 +00001247
jardineb5d44e2003-12-23 08:09:43 +00001248 return write;
1249}
jardineb5d44e2003-12-23 08:09:43 +00001250
1251DEFUN (ip_router_isis,
1252 ip_router_isis_cmd,
1253 "ip router isis WORD",
1254 "Interface Internet Protocol config commands\n"
1255 "IP router interface commands\n"
1256 "IS-IS Routing for IP\n"
hassof390d2c2004-09-10 20:48:21 +00001257 "Routing process tag\n")
jardineb5d44e2003-12-23 08:09:43 +00001258{
Josh Bailey3f045a02012-03-24 08:35:20 -07001259 struct isis_circuit *circuit;
jardineb5d44e2003-12-23 08:09:43 +00001260 struct interface *ifp;
1261 struct isis_area *area;
Christian Frankef1fc1db2015-11-10 18:43:31 +01001262 int rv;
hassof390d2c2004-09-10 20:48:21 +00001263
1264 ifp = (struct interface *) vty->index;
jardineb5d44e2003-12-23 08:09:43 +00001265 assert (ifp);
hassof390d2c2004-09-10 20:48:21 +00001266
Josh Bailey3f045a02012-03-24 08:35:20 -07001267 /* Prevent more than one area per circuit */
1268 circuit = circuit_scan_by_ifp (ifp);
1269 if (circuit)
hassof390d2c2004-09-10 20:48:21 +00001270 {
Josh Bailey3f045a02012-03-24 08:35:20 -07001271 if (circuit->ip_router == 1)
1272 {
1273 if (strcmp (circuit->area->area_tag, argv[0]))
1274 {
1275 vty_out (vty, "ISIS circuit is already defined on %s%s",
1276 circuit->area->area_tag, VTY_NEWLINE);
1277 return CMD_ERR_NOTHING_TODO;
1278 }
1279 return CMD_SUCCESS;
1280 }
jardineb5d44e2003-12-23 08:09:43 +00001281 }
hassof390d2c2004-09-10 20:48:21 +00001282
Josh Bailey3f045a02012-03-24 08:35:20 -07001283 if (isis_area_get (vty, argv[0]) != CMD_SUCCESS)
hassof390d2c2004-09-10 20:48:21 +00001284 {
Josh Bailey3f045a02012-03-24 08:35:20 -07001285 vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE);
1286 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00001287 }
Josh Bailey3f045a02012-03-24 08:35:20 -07001288 area = vty->index;
jardineb5d44e2003-12-23 08:09:43 +00001289
Josh Bailey3f045a02012-03-24 08:35:20 -07001290 circuit = isis_csm_state_change (ISIS_ENABLE, circuit, area);
Christian Frankef1fc1db2015-11-10 18:43:31 +01001291 if (circuit->state != C_STATE_CONF && circuit->state != C_STATE_UP)
1292 {
1293 vty_out(vty, "Couldn't bring up interface, please check log.%s", VTY_NEWLINE);
1294 rv = CMD_WARNING;
1295 }
1296 else
1297 {
1298 isis_circuit_if_bind (circuit, ifp);
jardineb5d44e2003-12-23 08:09:43 +00001299
Christian Frankef1fc1db2015-11-10 18:43:31 +01001300 circuit->ip_router = 1;
1301 area->ip_circuits++;
1302 circuit_update_nlpids (circuit);
1303 rv = CMD_SUCCESS;
1304 }
jardineb5d44e2003-12-23 08:09:43 +00001305
1306 vty->node = INTERFACE_NODE;
Josh Bailey3f045a02012-03-24 08:35:20 -07001307 vty->index = ifp;
hassof390d2c2004-09-10 20:48:21 +00001308
Christian Franke84a4da02016-04-03 12:46:27 -03001309 if (circuit->ipv6_router)
1310 lsp_regenerate_schedule(circuit->area, circuit->is_type, 0);
Christian Frankef1fc1db2015-11-10 18:43:31 +01001311 return rv;
jardineb5d44e2003-12-23 08:09:43 +00001312}
1313
1314DEFUN (no_ip_router_isis,
1315 no_ip_router_isis_cmd,
1316 "no ip router isis WORD",
1317 NO_STR
1318 "Interface Internet Protocol config commands\n"
1319 "IP router interface commands\n"
1320 "IS-IS Routing for IP\n"
hassof390d2c2004-09-10 20:48:21 +00001321 "Routing process tag\n")
jardineb5d44e2003-12-23 08:09:43 +00001322{
jardineb5d44e2003-12-23 08:09:43 +00001323 struct interface *ifp;
1324 struct isis_area *area;
Josh Bailey3f045a02012-03-24 08:35:20 -07001325 struct isis_circuit *circuit;
jardineb5d44e2003-12-23 08:09:43 +00001326
hassof390d2c2004-09-10 20:48:21 +00001327 ifp = (struct interface *) vty->index;
Josh Bailey3f045a02012-03-24 08:35:20 -07001328 if (!ifp)
1329 {
1330 vty_out (vty, "Invalid interface %s", VTY_NEWLINE);
1331 return CMD_ERR_NO_MATCH;
1332 }
hassof390d2c2004-09-10 20:48:21 +00001333
jardineb5d44e2003-12-23 08:09:43 +00001334 area = isis_area_lookup (argv[0]);
hassof390d2c2004-09-10 20:48:21 +00001335 if (!area)
1336 {
Josh Bailey3f045a02012-03-24 08:35:20 -07001337 vty_out (vty, "Can't find ISIS instance %s%s",
1338 argv[0], VTY_NEWLINE);
1339 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00001340 }
Josh Bailey3f045a02012-03-24 08:35:20 -07001341
1342 circuit = circuit_lookup_by_ifp (ifp, area->circuit_list);
hassof390d2c2004-09-10 20:48:21 +00001343 if (!circuit)
1344 {
Josh Bailey3f045a02012-03-24 08:35:20 -07001345 vty_out (vty, "ISIS is not enabled on circuit %s%s",
1346 ifp->name, VTY_NEWLINE);
1347 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00001348 }
Josh Bailey3f045a02012-03-24 08:35:20 -07001349
jardineb5d44e2003-12-23 08:09:43 +00001350 circuit->ip_router = 0;
1351 area->ip_circuits--;
jardineb5d44e2003-12-23 08:09:43 +00001352 if (circuit->ipv6_router == 0)
jardineb5d44e2003-12-23 08:09:43 +00001353 isis_csm_state_change (ISIS_DISABLE, circuit, area);
Christian Franke84a4da02016-04-03 12:46:27 -03001354 else
1355 lsp_regenerate_schedule(area, circuit->is_type, 0);
hassof390d2c2004-09-10 20:48:21 +00001356
jardineb5d44e2003-12-23 08:09:43 +00001357 return CMD_SUCCESS;
1358}
1359
Josh Bailey3f045a02012-03-24 08:35:20 -07001360#ifdef HAVE_IPV6
1361DEFUN (ipv6_router_isis,
1362 ipv6_router_isis_cmd,
1363 "ipv6 router isis WORD",
1364 "IPv6 interface subcommands\n"
1365 "IPv6 Router interface commands\n"
1366 "IS-IS Routing for IPv6\n"
1367 "Routing process tag\n")
1368{
1369 struct isis_circuit *circuit;
1370 struct interface *ifp;
1371 struct isis_area *area;
Christian Frankef1fc1db2015-11-10 18:43:31 +01001372 int rv;
Josh Bailey3f045a02012-03-24 08:35:20 -07001373
1374 ifp = (struct interface *) vty->index;
1375 assert (ifp);
1376
1377 /* Prevent more than one area per circuit */
1378 circuit = circuit_scan_by_ifp (ifp);
1379 if (circuit)
1380 {
1381 if (circuit->ipv6_router == 1)
1382 {
1383 if (strcmp (circuit->area->area_tag, argv[0]))
1384 {
1385 vty_out (vty, "ISIS circuit is already defined for IPv6 on %s%s",
1386 circuit->area->area_tag, VTY_NEWLINE);
1387 return CMD_ERR_NOTHING_TODO;
1388 }
1389 return CMD_SUCCESS;
1390 }
1391 }
1392
1393 if (isis_area_get (vty, argv[0]) != CMD_SUCCESS)
1394 {
1395 vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE);
1396 return CMD_ERR_NO_MATCH;
1397 }
1398 area = vty->index;
1399
1400 circuit = isis_csm_state_change (ISIS_ENABLE, circuit, area);
Christian Frankef1fc1db2015-11-10 18:43:31 +01001401 if (circuit->state != C_STATE_CONF && circuit->state != C_STATE_UP)
1402 {
1403 vty_out(vty, "Couldn't bring up interface, please check log.%s", VTY_NEWLINE);
1404 rv = CMD_WARNING;
1405 }
1406 else
1407 {
1408 isis_circuit_if_bind (circuit, ifp);
Josh Bailey3f045a02012-03-24 08:35:20 -07001409
Christian Frankef1fc1db2015-11-10 18:43:31 +01001410 circuit->ipv6_router = 1;
1411 area->ipv6_circuits++;
1412 circuit_update_nlpids (circuit);
1413 rv = CMD_SUCCESS;
1414 }
Josh Bailey3f045a02012-03-24 08:35:20 -07001415
1416 vty->node = INTERFACE_NODE;
1417 vty->index = ifp;
1418
Christian Franke84a4da02016-04-03 12:46:27 -03001419 if (circuit->ip_router)
1420 lsp_regenerate_schedule(circuit->area, circuit->is_type, 0);
Christian Frankef1fc1db2015-11-10 18:43:31 +01001421 return rv;
Josh Bailey3f045a02012-03-24 08:35:20 -07001422}
1423
1424DEFUN (no_ipv6_router_isis,
1425 no_ipv6_router_isis_cmd,
1426 "no ipv6 router isis WORD",
1427 NO_STR
1428 "IPv6 interface subcommands\n"
1429 "IPv6 Router interface commands\n"
1430 "IS-IS Routing for IPv6\n"
1431 "Routing process tag\n")
1432{
1433 struct interface *ifp;
1434 struct isis_area *area;
Josh Bailey3f045a02012-03-24 08:35:20 -07001435 struct isis_circuit *circuit;
1436
1437 ifp = (struct interface *) vty->index;
1438 if (!ifp)
1439 {
1440 vty_out (vty, "Invalid interface %s", VTY_NEWLINE);
1441 return CMD_ERR_NO_MATCH;
1442 }
1443
1444 area = isis_area_lookup (argv[0]);
1445 if (!area)
1446 {
1447 vty_out (vty, "Can't find ISIS instance %s%s",
1448 argv[0], VTY_NEWLINE);
1449 return CMD_ERR_NO_MATCH;
1450 }
1451
1452 circuit = circuit_lookup_by_ifp (ifp, area->circuit_list);
1453 if (!circuit)
1454 {
1455 vty_out (vty, "ISIS is not enabled on circuit %s%s",
1456 ifp->name, VTY_NEWLINE);
1457 return CMD_ERR_NO_MATCH;
1458 }
1459
1460 circuit->ipv6_router = 0;
1461 area->ipv6_circuits--;
1462 if (circuit->ip_router == 0)
1463 isis_csm_state_change (ISIS_DISABLE, circuit, area);
Christian Franke84a4da02016-04-03 12:46:27 -03001464 else
1465 lsp_regenerate_schedule(area, circuit->is_type, 0);
Josh Bailey3f045a02012-03-24 08:35:20 -07001466
1467 return CMD_SUCCESS;
1468}
1469#endif /* HAVE_IPV6 */
1470
1471DEFUN (isis_passive,
1472 isis_passive_cmd,
1473 "isis passive",
1474 "IS-IS commands\n"
1475 "Configure the passive mode for interface\n")
1476{
1477 struct isis_circuit *circuit = isis_circuit_lookup (vty);
1478 if (!circuit)
1479 return CMD_ERR_NO_MATCH;
1480
1481 if (circuit->is_passive == 1)
1482 return CMD_SUCCESS;
1483
1484 if (circuit->state != C_STATE_UP)
1485 {
1486 circuit->is_passive = 1;
1487 }
1488 else
1489 {
1490 struct isis_area *area = circuit->area;
1491 isis_csm_state_change (ISIS_DISABLE, circuit, area);
1492 circuit->is_passive = 1;
1493 isis_csm_state_change (ISIS_ENABLE, circuit, area);
1494 }
1495
1496 return CMD_SUCCESS;
1497}
1498
1499DEFUN (no_isis_passive,
1500 no_isis_passive_cmd,
1501 "no isis passive",
1502 NO_STR
1503 "IS-IS commands\n"
1504 "Configure the passive mode for interface\n")
1505{
1506 struct interface *ifp;
1507 struct isis_circuit *circuit;
1508
1509 ifp = (struct interface *) vty->index;
1510 if (!ifp)
1511 {
1512 vty_out (vty, "Invalid interface %s", VTY_NEWLINE);
1513 return CMD_ERR_NO_MATCH;
1514 }
1515
1516 /* FIXME: what is wrong with circuit = ifp->info ? */
1517 circuit = circuit_scan_by_ifp (ifp);
1518 if (!circuit)
1519 {
1520 vty_out (vty, "ISIS is not enabled on circuit %s%s",
1521 ifp->name, VTY_NEWLINE);
1522 return CMD_ERR_NO_MATCH;
1523 }
1524
1525 if (if_is_loopback(ifp))
1526 {
1527 vty_out (vty, "Can't set no passive for loopback interface%s",
1528 VTY_NEWLINE);
1529 return CMD_ERR_AMBIGUOUS;
1530 }
1531
1532 if (circuit->is_passive == 0)
1533 return CMD_SUCCESS;
1534
1535 if (circuit->state != C_STATE_UP)
1536 {
1537 circuit->is_passive = 0;
1538 }
1539 else
1540 {
1541 struct isis_area *area = circuit->area;
1542 isis_csm_state_change (ISIS_DISABLE, circuit, area);
1543 circuit->is_passive = 0;
1544 isis_csm_state_change (ISIS_ENABLE, circuit, area);
1545 }
1546
1547 return CMD_SUCCESS;
1548}
1549
jardineb5d44e2003-12-23 08:09:43 +00001550DEFUN (isis_circuit_type,
1551 isis_circuit_type_cmd,
1552 "isis circuit-type (level-1|level-1-2|level-2-only)",
1553 "IS-IS commands\n"
1554 "Configure circuit type for interface\n"
1555 "Level-1 only adjacencies are formed\n"
1556 "Level-1-2 adjacencies are formed\n"
hassof390d2c2004-09-10 20:48:21 +00001557 "Level-2 only adjacencies are formed\n")
jardineb5d44e2003-12-23 08:09:43 +00001558{
Josh Bailey3f045a02012-03-24 08:35:20 -07001559 int circuit_type;
1560 struct isis_circuit *circuit = isis_circuit_lookup (vty);
1561 if (!circuit)
1562 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00001563
Josh Bailey3f045a02012-03-24 08:35:20 -07001564 circuit_type = string2circuit_t (argv[0]);
1565 if (!circuit_type)
hassof390d2c2004-09-10 20:48:21 +00001566 {
1567 vty_out (vty, "Unknown circuit-type %s", VTY_NEWLINE);
Josh Bailey3f045a02012-03-24 08:35:20 -07001568 return CMD_ERR_AMBIGUOUS;
hassof390d2c2004-09-10 20:48:21 +00001569 }
1570
Josh Bailey3f045a02012-03-24 08:35:20 -07001571 if (circuit->state == C_STATE_UP &&
1572 circuit->area->is_type != IS_LEVEL_1_AND_2 &&
1573 circuit->area->is_type != circuit_type)
hassof390d2c2004-09-10 20:48:21 +00001574 {
Josh Bailey3f045a02012-03-24 08:35:20 -07001575 vty_out (vty, "Invalid circuit level for area %s.%s",
1576 circuit->area->area_tag, VTY_NEWLINE);
1577 return CMD_ERR_AMBIGUOUS;
hassof390d2c2004-09-10 20:48:21 +00001578 }
Josh Bailey3f045a02012-03-24 08:35:20 -07001579 isis_event_circuit_type_change (circuit, circuit_type);
hassof390d2c2004-09-10 20:48:21 +00001580
jardineb5d44e2003-12-23 08:09:43 +00001581 return CMD_SUCCESS;
1582}
1583
1584DEFUN (no_isis_circuit_type,
1585 no_isis_circuit_type_cmd,
1586 "no isis circuit-type (level-1|level-1-2|level-2-only)",
1587 NO_STR
1588 "IS-IS commands\n"
1589 "Configure circuit type for interface\n"
1590 "Level-1 only adjacencies are formed\n"
1591 "Level-1-2 adjacencies are formed\n"
hassof390d2c2004-09-10 20:48:21 +00001592 "Level-2 only adjacencies are formed\n")
jardineb5d44e2003-12-23 08:09:43 +00001593{
Josh Bailey3f045a02012-03-24 08:35:20 -07001594 int circuit_type;
1595 struct isis_circuit *circuit = isis_circuit_lookup (vty);
1596 if (!circuit)
1597 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00001598
jardineb5d44e2003-12-23 08:09:43 +00001599 /*
Josh Bailey3f045a02012-03-24 08:35:20 -07001600 * Set the circuits level to its default value
jardineb5d44e2003-12-23 08:09:43 +00001601 */
Josh Bailey3f045a02012-03-24 08:35:20 -07001602 if (circuit->state == C_STATE_UP)
1603 circuit_type = circuit->area->is_type;
1604 else
1605 circuit_type = IS_LEVEL_1_AND_2;
1606 isis_event_circuit_type_change (circuit, circuit_type);
hassof390d2c2004-09-10 20:48:21 +00001607
jardineb5d44e2003-12-23 08:09:43 +00001608 return CMD_SUCCESS;
1609}
1610
Josh Bailey3f045a02012-03-24 08:35:20 -07001611DEFUN (isis_passwd_md5,
1612 isis_passwd_md5_cmd,
1613 "isis password md5 WORD",
jardineb5d44e2003-12-23 08:09:43 +00001614 "IS-IS commands\n"
Josh Bailey3f045a02012-03-24 08:35:20 -07001615 "Configure the authentication password for a circuit\n"
1616 "Authentication type\n"
1617 "Circuit password\n")
jardineb5d44e2003-12-23 08:09:43 +00001618{
jardineb5d44e2003-12-23 08:09:43 +00001619 int len;
Josh Bailey3f045a02012-03-24 08:35:20 -07001620 struct isis_circuit *circuit = isis_circuit_lookup (vty);
1621 if (!circuit)
1622 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00001623
jardineb5d44e2003-12-23 08:09:43 +00001624 len = strlen (argv[0]);
hassof390d2c2004-09-10 20:48:21 +00001625 if (len > 254)
1626 {
1627 vty_out (vty, "Too long circuit password (>254)%s", VTY_NEWLINE);
Josh Bailey3f045a02012-03-24 08:35:20 -07001628 return CMD_ERR_AMBIGUOUS;
1629 }
1630 circuit->passwd.len = len;
1631 circuit->passwd.type = ISIS_PASSWD_TYPE_HMAC_MD5;
1632 strncpy ((char *)circuit->passwd.passwd, argv[0], 255);
1633
1634 return CMD_SUCCESS;
1635}
1636
1637DEFUN (isis_passwd_clear,
1638 isis_passwd_clear_cmd,
1639 "isis password clear WORD",
1640 "IS-IS commands\n"
1641 "Configure the authentication password for a circuit\n"
1642 "Authentication type\n"
1643 "Circuit password\n")
1644{
1645 int len;
1646 struct isis_circuit *circuit = isis_circuit_lookup (vty);
1647 if (!circuit)
1648 return CMD_ERR_NO_MATCH;
1649
1650 len = strlen (argv[0]);
1651 if (len > 254)
1652 {
1653 vty_out (vty, "Too long circuit password (>254)%s", VTY_NEWLINE);
1654 return CMD_ERR_AMBIGUOUS;
hassof390d2c2004-09-10 20:48:21 +00001655 }
jardineb5d44e2003-12-23 08:09:43 +00001656 circuit->passwd.len = len;
1657 circuit->passwd.type = ISIS_PASSWD_TYPE_CLEARTXT;
hassof7c43dc2004-09-26 16:24:14 +00001658 strncpy ((char *)circuit->passwd.passwd, argv[0], 255);
hassof390d2c2004-09-10 20:48:21 +00001659
jardineb5d44e2003-12-23 08:09:43 +00001660 return CMD_SUCCESS;
1661}
1662
1663DEFUN (no_isis_passwd,
1664 no_isis_passwd_cmd,
1665 "no isis password",
1666 NO_STR
1667 "IS-IS commands\n"
Josh Bailey3f045a02012-03-24 08:35:20 -07001668 "Configure the authentication password for a circuit\n")
jardineb5d44e2003-12-23 08:09:43 +00001669{
Josh Bailey3f045a02012-03-24 08:35:20 -07001670 struct isis_circuit *circuit = isis_circuit_lookup (vty);
1671 if (!circuit)
1672 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00001673
jardineb5d44e2003-12-23 08:09:43 +00001674 memset (&circuit->passwd, 0, sizeof (struct isis_passwd));
hassof390d2c2004-09-10 20:48:21 +00001675
jardineb5d44e2003-12-23 08:09:43 +00001676 return CMD_SUCCESS;
1677}
1678
jardineb5d44e2003-12-23 08:09:43 +00001679DEFUN (isis_priority,
1680 isis_priority_cmd,
1681 "isis priority <0-127>",
1682 "IS-IS commands\n"
1683 "Set priority for Designated Router election\n"
hassof390d2c2004-09-10 20:48:21 +00001684 "Priority value\n")
jardineb5d44e2003-12-23 08:09:43 +00001685{
jardineb5d44e2003-12-23 08:09:43 +00001686 int prio;
Josh Bailey3f045a02012-03-24 08:35:20 -07001687 struct isis_circuit *circuit = isis_circuit_lookup (vty);
1688 if (!circuit)
1689 return CMD_ERR_NO_MATCH;
jardineb5d44e2003-12-23 08:09:43 +00001690
1691 prio = atoi (argv[0]);
Josh Bailey3f045a02012-03-24 08:35:20 -07001692 if (prio < MIN_PRIORITY || prio > MAX_PRIORITY)
1693 {
1694 vty_out (vty, "Invalid priority %d - should be <0-127>%s",
1695 prio, VTY_NEWLINE);
1696 return CMD_ERR_AMBIGUOUS;
1697 }
jardineb5d44e2003-12-23 08:09:43 +00001698
Josh Bailey3f045a02012-03-24 08:35:20 -07001699 circuit->priority[0] = prio;
1700 circuit->priority[1] = prio;
hassof390d2c2004-09-10 20:48:21 +00001701
jardineb5d44e2003-12-23 08:09:43 +00001702 return CMD_SUCCESS;
1703}
1704
1705DEFUN (no_isis_priority,
1706 no_isis_priority_cmd,
1707 "no isis priority",
1708 NO_STR
1709 "IS-IS commands\n"
hassof390d2c2004-09-10 20:48:21 +00001710 "Set priority for Designated Router election\n")
jardineb5d44e2003-12-23 08:09:43 +00001711{
Josh Bailey3f045a02012-03-24 08:35:20 -07001712 struct isis_circuit *circuit = isis_circuit_lookup (vty);
1713 if (!circuit)
1714 return CMD_ERR_NO_MATCH;
jardineb5d44e2003-12-23 08:09:43 +00001715
Josh Bailey3f045a02012-03-24 08:35:20 -07001716 circuit->priority[0] = DEFAULT_PRIORITY;
1717 circuit->priority[1] = DEFAULT_PRIORITY;
hassof390d2c2004-09-10 20:48:21 +00001718
jardineb5d44e2003-12-23 08:09:43 +00001719 return CMD_SUCCESS;
1720}
1721
1722ALIAS (no_isis_priority,
1723 no_isis_priority_arg_cmd,
1724 "no isis priority <0-127>",
1725 NO_STR
1726 "IS-IS commands\n"
1727 "Set priority for Designated Router election\n"
hassof390d2c2004-09-10 20:48:21 +00001728 "Priority value\n")
jardineb5d44e2003-12-23 08:09:43 +00001729
1730DEFUN (isis_priority_l1,
1731 isis_priority_l1_cmd,
hassof390d2c2004-09-10 20:48:21 +00001732 "isis priority <0-127> level-1",
jardineb5d44e2003-12-23 08:09:43 +00001733 "IS-IS commands\n"
1734 "Set priority for Designated Router election\n"
1735 "Priority value\n"
hassof390d2c2004-09-10 20:48:21 +00001736 "Specify priority for level-1 routing\n")
jardineb5d44e2003-12-23 08:09:43 +00001737{
jardineb5d44e2003-12-23 08:09:43 +00001738 int prio;
Josh Bailey3f045a02012-03-24 08:35:20 -07001739 struct isis_circuit *circuit = isis_circuit_lookup (vty);
1740 if (!circuit)
1741 return CMD_ERR_NO_MATCH;
jardineb5d44e2003-12-23 08:09:43 +00001742
1743 prio = atoi (argv[0]);
Josh Bailey3f045a02012-03-24 08:35:20 -07001744 if (prio < MIN_PRIORITY || prio > MAX_PRIORITY)
1745 {
1746 vty_out (vty, "Invalid priority %d - should be <0-127>%s",
1747 prio, VTY_NEWLINE);
1748 return CMD_ERR_AMBIGUOUS;
1749 }
jardineb5d44e2003-12-23 08:09:43 +00001750
Josh Bailey3f045a02012-03-24 08:35:20 -07001751 circuit->priority[0] = prio;
hassof390d2c2004-09-10 20:48:21 +00001752
jardineb5d44e2003-12-23 08:09:43 +00001753 return CMD_SUCCESS;
1754}
1755
1756DEFUN (no_isis_priority_l1,
1757 no_isis_priority_l1_cmd,
1758 "no isis priority level-1",
1759 NO_STR
1760 "IS-IS commands\n"
1761 "Set priority for Designated Router election\n"
hassof390d2c2004-09-10 20:48:21 +00001762 "Specify priority for level-1 routing\n")
jardineb5d44e2003-12-23 08:09:43 +00001763{
Josh Bailey3f045a02012-03-24 08:35:20 -07001764 struct isis_circuit *circuit = isis_circuit_lookup (vty);
1765 if (!circuit)
1766 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00001767
Josh Bailey3f045a02012-03-24 08:35:20 -07001768 circuit->priority[0] = DEFAULT_PRIORITY;
hassof390d2c2004-09-10 20:48:21 +00001769
jardineb5d44e2003-12-23 08:09:43 +00001770 return CMD_SUCCESS;
1771}
1772
1773ALIAS (no_isis_priority_l1,
1774 no_isis_priority_l1_arg_cmd,
1775 "no isis priority <0-127> level-1",
1776 NO_STR
1777 "IS-IS commands\n"
1778 "Set priority for Designated Router election\n"
1779 "Priority value\n"
hassof390d2c2004-09-10 20:48:21 +00001780 "Specify priority for level-1 routing\n")
jardineb5d44e2003-12-23 08:09:43 +00001781
1782DEFUN (isis_priority_l2,
1783 isis_priority_l2_cmd,
hassof390d2c2004-09-10 20:48:21 +00001784 "isis priority <0-127> level-2",
jardineb5d44e2003-12-23 08:09:43 +00001785 "IS-IS commands\n"
1786 "Set priority for Designated Router election\n"
1787 "Priority value\n"
hassof390d2c2004-09-10 20:48:21 +00001788 "Specify priority for level-2 routing\n")
jardineb5d44e2003-12-23 08:09:43 +00001789{
jardineb5d44e2003-12-23 08:09:43 +00001790 int prio;
Josh Bailey3f045a02012-03-24 08:35:20 -07001791 struct isis_circuit *circuit = isis_circuit_lookup (vty);
1792 if (!circuit)
1793 return CMD_ERR_NO_MATCH;
jardineb5d44e2003-12-23 08:09:43 +00001794
1795 prio = atoi (argv[0]);
Josh Bailey3f045a02012-03-24 08:35:20 -07001796 if (prio < MIN_PRIORITY || prio > MAX_PRIORITY)
1797 {
1798 vty_out (vty, "Invalid priority %d - should be <0-127>%s",
1799 prio, VTY_NEWLINE);
1800 return CMD_ERR_AMBIGUOUS;
1801 }
jardineb5d44e2003-12-23 08:09:43 +00001802
Josh Bailey3f045a02012-03-24 08:35:20 -07001803 circuit->priority[1] = prio;
hassof390d2c2004-09-10 20:48:21 +00001804
jardineb5d44e2003-12-23 08:09:43 +00001805 return CMD_SUCCESS;
1806}
1807
1808DEFUN (no_isis_priority_l2,
1809 no_isis_priority_l2_cmd,
1810 "no isis priority level-2",
1811 NO_STR
1812 "IS-IS commands\n"
1813 "Set priority for Designated Router election\n"
hassof390d2c2004-09-10 20:48:21 +00001814 "Specify priority for level-2 routing\n")
jardineb5d44e2003-12-23 08:09:43 +00001815{
Josh Bailey3f045a02012-03-24 08:35:20 -07001816 struct isis_circuit *circuit = isis_circuit_lookup (vty);
1817 if (!circuit)
1818 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00001819
Josh Bailey3f045a02012-03-24 08:35:20 -07001820 circuit->priority[1] = DEFAULT_PRIORITY;
hassof390d2c2004-09-10 20:48:21 +00001821
jardineb5d44e2003-12-23 08:09:43 +00001822 return CMD_SUCCESS;
1823}
1824
1825ALIAS (no_isis_priority_l2,
1826 no_isis_priority_l2_arg_cmd,
1827 "no isis priority <0-127> level-2",
1828 NO_STR
1829 "IS-IS commands\n"
1830 "Set priority for Designated Router election\n"
1831 "Priority value\n"
hassof390d2c2004-09-10 20:48:21 +00001832 "Specify priority for level-2 routing\n")
jardineb5d44e2003-12-23 08:09:43 +00001833
1834/* Metric command */
Josh Bailey3f045a02012-03-24 08:35:20 -07001835DEFUN (isis_metric,
jardineb5d44e2003-12-23 08:09:43 +00001836 isis_metric_cmd,
hassof21fb272005-09-26 17:05:55 +00001837 "isis metric <0-16777215>",
jardineb5d44e2003-12-23 08:09:43 +00001838 "IS-IS commands\n"
1839 "Set default metric for circuit\n"
hassof390d2c2004-09-10 20:48:21 +00001840 "Default metric value\n")
jardineb5d44e2003-12-23 08:09:43 +00001841{
jardineb5d44e2003-12-23 08:09:43 +00001842 int met;
Josh Bailey3f045a02012-03-24 08:35:20 -07001843 struct isis_circuit *circuit = isis_circuit_lookup (vty);
1844 if (!circuit)
1845 return CMD_ERR_NO_MATCH;
jardineb5d44e2003-12-23 08:09:43 +00001846
1847 met = atoi (argv[0]);
1848
Josh Bailey3f045a02012-03-24 08:35:20 -07001849 /* RFC3787 section 5.1 */
1850 if (circuit->area && circuit->area->oldmetric == 1 &&
1851 met > MAX_NARROW_LINK_METRIC)
1852 {
1853 vty_out (vty, "Invalid metric %d - should be <0-63> "
1854 "when narrow metric type enabled%s",
1855 met, VTY_NEWLINE);
1856 return CMD_ERR_AMBIGUOUS;
1857 }
1858
1859 /* RFC4444 */
1860 if (circuit->area && circuit->area->newmetric == 1 &&
1861 met > MAX_WIDE_LINK_METRIC)
1862 {
1863 vty_out (vty, "Invalid metric %d - should be <0-16777215> "
1864 "when wide metric type enabled%s",
1865 met, VTY_NEWLINE);
1866 return CMD_ERR_AMBIGUOUS;
1867 }
1868
hassof21fb272005-09-26 17:05:55 +00001869 circuit->te_metric[0] = met;
1870 circuit->te_metric[1] = met;
1871
jardineb5d44e2003-12-23 08:09:43 +00001872 circuit->metrics[0].metric_default = met;
1873 circuit->metrics[1].metric_default = met;
1874
Josh Bailey3f045a02012-03-24 08:35:20 -07001875 if (circuit->area)
1876 lsp_regenerate_schedule (circuit->area, circuit->is_type, 0);
1877
jardineb5d44e2003-12-23 08:09:43 +00001878 return CMD_SUCCESS;
1879}
1880
1881DEFUN (no_isis_metric,
1882 no_isis_metric_cmd,
1883 "no isis metric",
1884 NO_STR
1885 "IS-IS commands\n"
hassof390d2c2004-09-10 20:48:21 +00001886 "Set default metric for circuit\n")
jardineb5d44e2003-12-23 08:09:43 +00001887{
Josh Bailey3f045a02012-03-24 08:35:20 -07001888 struct isis_circuit *circuit = isis_circuit_lookup (vty);
1889 if (!circuit)
1890 return CMD_ERR_NO_MATCH;
jardineb5d44e2003-12-23 08:09:43 +00001891
Josh Bailey3f045a02012-03-24 08:35:20 -07001892 circuit->te_metric[0] = DEFAULT_CIRCUIT_METRIC;
1893 circuit->te_metric[1] = DEFAULT_CIRCUIT_METRIC;
1894 circuit->metrics[0].metric_default = DEFAULT_CIRCUIT_METRIC;
1895 circuit->metrics[1].metric_default = DEFAULT_CIRCUIT_METRIC;
jardineb5d44e2003-12-23 08:09:43 +00001896
Josh Bailey3f045a02012-03-24 08:35:20 -07001897 if (circuit->area)
1898 lsp_regenerate_schedule (circuit->area, circuit->is_type, 0);
jardineb5d44e2003-12-23 08:09:43 +00001899
1900 return CMD_SUCCESS;
1901}
1902
1903ALIAS (no_isis_metric,
1904 no_isis_metric_arg_cmd,
hassof21fb272005-09-26 17:05:55 +00001905 "no isis metric <0-16777215>",
jardineb5d44e2003-12-23 08:09:43 +00001906 NO_STR
1907 "IS-IS commands\n"
1908 "Set default metric for circuit\n"
hassof390d2c2004-09-10 20:48:21 +00001909 "Default metric value\n")
1910
Josh Bailey3f045a02012-03-24 08:35:20 -07001911DEFUN (isis_metric_l1,
1912 isis_metric_l1_cmd,
1913 "isis metric <0-16777215> level-1",
1914 "IS-IS commands\n"
1915 "Set default metric for circuit\n"
1916 "Default metric value\n"
1917 "Specify metric for level-1 routing\n")
1918{
1919 int met;
1920 struct isis_circuit *circuit = isis_circuit_lookup (vty);
1921 if (!circuit)
1922 return CMD_ERR_NO_MATCH;
1923
1924 met = atoi (argv[0]);
1925
1926 /* RFC3787 section 5.1 */
1927 if (circuit->area && circuit->area->oldmetric == 1 &&
1928 met > MAX_NARROW_LINK_METRIC)
1929 {
1930 vty_out (vty, "Invalid metric %d - should be <0-63> "
1931 "when narrow metric type enabled%s",
1932 met, VTY_NEWLINE);
1933 return CMD_ERR_AMBIGUOUS;
1934 }
1935
1936 /* RFC4444 */
1937 if (circuit->area && circuit->area->newmetric == 1 &&
1938 met > MAX_WIDE_LINK_METRIC)
1939 {
1940 vty_out (vty, "Invalid metric %d - should be <0-16777215> "
1941 "when wide metric type enabled%s",
1942 met, VTY_NEWLINE);
1943 return CMD_ERR_AMBIGUOUS;
1944 }
1945
1946 circuit->te_metric[0] = met;
1947 circuit->metrics[0].metric_default = met;
1948
1949 if (circuit->area)
1950 lsp_regenerate_schedule (circuit->area, IS_LEVEL_1, 0);
1951
1952 return CMD_SUCCESS;
1953}
1954
1955DEFUN (no_isis_metric_l1,
1956 no_isis_metric_l1_cmd,
1957 "no isis metric level-1",
1958 NO_STR
1959 "IS-IS commands\n"
1960 "Set default metric for circuit\n"
1961 "Specify metric for level-1 routing\n")
1962{
1963 struct isis_circuit *circuit = isis_circuit_lookup (vty);
1964 if (!circuit)
1965 return CMD_ERR_NO_MATCH;
1966
1967 circuit->te_metric[0] = DEFAULT_CIRCUIT_METRIC;
1968 circuit->metrics[0].metric_default = DEFAULT_CIRCUIT_METRIC;
1969
1970 if (circuit->area)
1971 lsp_regenerate_schedule (circuit->area, IS_LEVEL_1, 0);
1972
1973 return CMD_SUCCESS;
1974}
1975
1976ALIAS (no_isis_metric_l1,
1977 no_isis_metric_l1_arg_cmd,
1978 "no isis metric <0-16777215> level-1",
1979 NO_STR
1980 "IS-IS commands\n"
1981 "Set default metric for circuit\n"
1982 "Default metric value\n"
1983 "Specify metric for level-1 routing\n")
1984
1985DEFUN (isis_metric_l2,
1986 isis_metric_l2_cmd,
1987 "isis metric <0-16777215> level-2",
1988 "IS-IS commands\n"
1989 "Set default metric for circuit\n"
1990 "Default metric value\n"
1991 "Specify metric for level-2 routing\n")
1992{
1993 int met;
1994 struct isis_circuit *circuit = isis_circuit_lookup (vty);
1995 if (!circuit)
1996 return CMD_ERR_NO_MATCH;
1997
1998 met = atoi (argv[0]);
1999
2000 /* RFC3787 section 5.1 */
2001 if (circuit->area && circuit->area->oldmetric == 1 &&
2002 met > MAX_NARROW_LINK_METRIC)
2003 {
2004 vty_out (vty, "Invalid metric %d - should be <0-63> "
2005 "when narrow metric type enabled%s",
2006 met, VTY_NEWLINE);
2007 return CMD_ERR_AMBIGUOUS;
2008 }
2009
2010 /* RFC4444 */
2011 if (circuit->area && circuit->area->newmetric == 1 &&
2012 met > MAX_WIDE_LINK_METRIC)
2013 {
2014 vty_out (vty, "Invalid metric %d - should be <0-16777215> "
2015 "when wide metric type enabled%s",
2016 met, VTY_NEWLINE);
2017 return CMD_ERR_AMBIGUOUS;
2018 }
2019
2020 circuit->te_metric[1] = met;
2021 circuit->metrics[1].metric_default = met;
2022
2023 if (circuit->area)
2024 lsp_regenerate_schedule (circuit->area, IS_LEVEL_2, 0);
2025
2026 return CMD_SUCCESS;
2027}
2028
2029DEFUN (no_isis_metric_l2,
2030 no_isis_metric_l2_cmd,
2031 "no isis metric level-2",
2032 NO_STR
2033 "IS-IS commands\n"
2034 "Set default metric for circuit\n"
2035 "Specify metric for level-2 routing\n")
2036{
2037 struct isis_circuit *circuit = isis_circuit_lookup (vty);
2038 if (!circuit)
2039 return CMD_ERR_NO_MATCH;
2040
2041 circuit->te_metric[1] = DEFAULT_CIRCUIT_METRIC;
2042 circuit->metrics[1].metric_default = DEFAULT_CIRCUIT_METRIC;
2043
2044 if (circuit->area)
2045 lsp_regenerate_schedule (circuit->area, IS_LEVEL_2, 0);
2046
2047 return CMD_SUCCESS;
2048}
2049
2050ALIAS (no_isis_metric_l2,
2051 no_isis_metric_l2_arg_cmd,
2052 "no isis metric <0-16777215> level-2",
2053 NO_STR
2054 "IS-IS commands\n"
2055 "Set default metric for circuit\n"
2056 "Default metric value\n"
2057 "Specify metric for level-2 routing\n")
jardineb5d44e2003-12-23 08:09:43 +00002058/* end of metrics */
Josh Bailey3f045a02012-03-24 08:35:20 -07002059
hassof21fb272005-09-26 17:05:55 +00002060DEFUN (isis_hello_interval,
jardineb5d44e2003-12-23 08:09:43 +00002061 isis_hello_interval_cmd,
Josh Bailey3f045a02012-03-24 08:35:20 -07002062 "isis hello-interval <1-600>",
jardineb5d44e2003-12-23 08:09:43 +00002063 "IS-IS commands\n"
2064 "Set Hello interval\n"
2065 "Hello interval value\n"
hassof390d2c2004-09-10 20:48:21 +00002066 "Holdtime 1 seconds, interval depends on multiplier\n")
jardineb5d44e2003-12-23 08:09:43 +00002067{
jardineb5d44e2003-12-23 08:09:43 +00002068 int interval;
Josh Bailey3f045a02012-03-24 08:35:20 -07002069 struct isis_circuit *circuit = isis_circuit_lookup (vty);
2070 if (!circuit)
2071 return CMD_ERR_NO_MATCH;
jardineb5d44e2003-12-23 08:09:43 +00002072
Josh Bailey3f045a02012-03-24 08:35:20 -07002073 interval = atoi (argv[0]);
2074 if (interval < MIN_HELLO_INTERVAL || interval > MAX_HELLO_INTERVAL)
hassof390d2c2004-09-10 20:48:21 +00002075 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002076 vty_out (vty, "Invalid hello-interval %d - should be <1-600>%s",
2077 interval, VTY_NEWLINE);
2078 return CMD_ERR_AMBIGUOUS;
hassof390d2c2004-09-10 20:48:21 +00002079 }
jardineb5d44e2003-12-23 08:09:43 +00002080
hassof390d2c2004-09-10 20:48:21 +00002081 circuit->hello_interval[0] = (u_int16_t) interval;
2082 circuit->hello_interval[1] = (u_int16_t) interval;
2083
jardineb5d44e2003-12-23 08:09:43 +00002084 return CMD_SUCCESS;
2085}
2086
2087DEFUN (no_isis_hello_interval,
2088 no_isis_hello_interval_cmd,
2089 "no isis hello-interval",
2090 NO_STR
2091 "IS-IS commands\n"
hassof390d2c2004-09-10 20:48:21 +00002092 "Set Hello interval\n")
jardineb5d44e2003-12-23 08:09:43 +00002093{
Josh Bailey3f045a02012-03-24 08:35:20 -07002094 struct isis_circuit *circuit = isis_circuit_lookup (vty);
2095 if (!circuit)
2096 return CMD_ERR_NO_MATCH;
jardineb5d44e2003-12-23 08:09:43 +00002097
Josh Bailey3f045a02012-03-24 08:35:20 -07002098 circuit->hello_interval[0] = DEFAULT_HELLO_INTERVAL;
2099 circuit->hello_interval[1] = DEFAULT_HELLO_INTERVAL;
hassof390d2c2004-09-10 20:48:21 +00002100
jardineb5d44e2003-12-23 08:09:43 +00002101 return CMD_SUCCESS;
2102}
2103
2104ALIAS (no_isis_hello_interval,
2105 no_isis_hello_interval_arg_cmd,
Josh Bailey3f045a02012-03-24 08:35:20 -07002106 "no isis hello-interval <1-600>",
jardineb5d44e2003-12-23 08:09:43 +00002107 NO_STR
2108 "IS-IS commands\n"
2109 "Set Hello interval\n"
2110 "Hello interval value\n"
hassof390d2c2004-09-10 20:48:21 +00002111 "Holdtime 1 second, interval depends on multiplier\n")
jardineb5d44e2003-12-23 08:09:43 +00002112
2113DEFUN (isis_hello_interval_l1,
2114 isis_hello_interval_l1_cmd,
Josh Bailey3f045a02012-03-24 08:35:20 -07002115 "isis hello-interval <1-600> level-1",
jardineb5d44e2003-12-23 08:09:43 +00002116 "IS-IS commands\n"
2117 "Set Hello interval\n"
2118 "Hello interval value\n"
2119 "Holdtime 1 second, interval depends on multiplier\n"
hassof390d2c2004-09-10 20:48:21 +00002120 "Specify hello-interval for level-1 IIHs\n")
jardineb5d44e2003-12-23 08:09:43 +00002121{
jardineb5d44e2003-12-23 08:09:43 +00002122 long interval;
Josh Bailey3f045a02012-03-24 08:35:20 -07002123 struct isis_circuit *circuit = isis_circuit_lookup (vty);
2124 if (!circuit)
2125 return CMD_ERR_NO_MATCH;
jardineb5d44e2003-12-23 08:09:43 +00002126
Josh Bailey3f045a02012-03-24 08:35:20 -07002127 interval = atoi (argv[0]);
2128 if (interval < MIN_HELLO_INTERVAL || interval > MAX_HELLO_INTERVAL)
hassof390d2c2004-09-10 20:48:21 +00002129 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002130 vty_out (vty, "Invalid hello-interval %ld - should be <1-600>%s",
2131 interval, VTY_NEWLINE);
2132 return CMD_ERR_AMBIGUOUS;
hassof390d2c2004-09-10 20:48:21 +00002133 }
jardineb5d44e2003-12-23 08:09:43 +00002134
hassof390d2c2004-09-10 20:48:21 +00002135 circuit->hello_interval[0] = (u_int16_t) interval;
2136
jardineb5d44e2003-12-23 08:09:43 +00002137 return CMD_SUCCESS;
2138}
2139
2140DEFUN (no_isis_hello_interval_l1,
2141 no_isis_hello_interval_l1_cmd,
2142 "no isis hello-interval level-1",
2143 NO_STR
2144 "IS-IS commands\n"
2145 "Set Hello interval\n"
hassof390d2c2004-09-10 20:48:21 +00002146 "Specify hello-interval for level-1 IIHs\n")
jardineb5d44e2003-12-23 08:09:43 +00002147{
Josh Bailey3f045a02012-03-24 08:35:20 -07002148 struct isis_circuit *circuit = isis_circuit_lookup (vty);
2149 if (!circuit)
2150 return CMD_ERR_NO_MATCH;
jardineb5d44e2003-12-23 08:09:43 +00002151
Josh Bailey3f045a02012-03-24 08:35:20 -07002152 circuit->hello_interval[0] = DEFAULT_HELLO_INTERVAL;
hassof390d2c2004-09-10 20:48:21 +00002153
jardineb5d44e2003-12-23 08:09:43 +00002154 return CMD_SUCCESS;
2155}
2156
2157ALIAS (no_isis_hello_interval_l1,
2158 no_isis_hello_interval_l1_arg_cmd,
Josh Bailey3f045a02012-03-24 08:35:20 -07002159 "no isis hello-interval <1-600> level-1",
jardineb5d44e2003-12-23 08:09:43 +00002160 NO_STR
2161 "IS-IS commands\n"
2162 "Set Hello interval\n"
2163 "Hello interval value\n"
2164 "Holdtime 1 second, interval depends on multiplier\n"
hassof390d2c2004-09-10 20:48:21 +00002165 "Specify hello-interval for level-1 IIHs\n")
jardineb5d44e2003-12-23 08:09:43 +00002166
2167DEFUN (isis_hello_interval_l2,
2168 isis_hello_interval_l2_cmd,
Josh Bailey3f045a02012-03-24 08:35:20 -07002169 "isis hello-interval <1-600> level-2",
jardineb5d44e2003-12-23 08:09:43 +00002170 "IS-IS commands\n"
2171 "Set Hello interval\n"
2172 "Hello interval value\n"
2173 "Holdtime 1 second, interval depends on multiplier\n"
hassof390d2c2004-09-10 20:48:21 +00002174 "Specify hello-interval for level-2 IIHs\n")
jardineb5d44e2003-12-23 08:09:43 +00002175{
jardineb5d44e2003-12-23 08:09:43 +00002176 long interval;
Josh Bailey3f045a02012-03-24 08:35:20 -07002177 struct isis_circuit *circuit = isis_circuit_lookup (vty);
2178 if (!circuit)
2179 return CMD_ERR_NO_MATCH;
jardineb5d44e2003-12-23 08:09:43 +00002180
Josh Bailey3f045a02012-03-24 08:35:20 -07002181 interval = atoi (argv[0]);
2182 if (interval < MIN_HELLO_INTERVAL || interval > MAX_HELLO_INTERVAL)
hassof390d2c2004-09-10 20:48:21 +00002183 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002184 vty_out (vty, "Invalid hello-interval %ld - should be <1-600>%s",
2185 interval, VTY_NEWLINE);
2186 return CMD_ERR_AMBIGUOUS;
hassof390d2c2004-09-10 20:48:21 +00002187 }
jardineb5d44e2003-12-23 08:09:43 +00002188
hassof390d2c2004-09-10 20:48:21 +00002189 circuit->hello_interval[1] = (u_int16_t) interval;
2190
jardineb5d44e2003-12-23 08:09:43 +00002191 return CMD_SUCCESS;
2192}
2193
2194DEFUN (no_isis_hello_interval_l2,
2195 no_isis_hello_interval_l2_cmd,
2196 "no isis hello-interval level-2",
2197 NO_STR
2198 "IS-IS commands\n"
2199 "Set Hello interval\n"
hassof390d2c2004-09-10 20:48:21 +00002200 "Specify hello-interval for level-2 IIHs\n")
jardineb5d44e2003-12-23 08:09:43 +00002201{
Josh Bailey3f045a02012-03-24 08:35:20 -07002202 struct isis_circuit *circuit = isis_circuit_lookup (vty);
2203 if (!circuit)
2204 return CMD_ERR_NO_MATCH;
jardineb5d44e2003-12-23 08:09:43 +00002205
Josh Bailey3f045a02012-03-24 08:35:20 -07002206 circuit->hello_interval[1] = DEFAULT_HELLO_INTERVAL;
hassof390d2c2004-09-10 20:48:21 +00002207
jardineb5d44e2003-12-23 08:09:43 +00002208 return CMD_SUCCESS;
2209}
2210
2211ALIAS (no_isis_hello_interval_l2,
2212 no_isis_hello_interval_l2_arg_cmd,
Josh Bailey3f045a02012-03-24 08:35:20 -07002213 "no isis hello-interval <1-600> level-2",
jardineb5d44e2003-12-23 08:09:43 +00002214 NO_STR
2215 "IS-IS commands\n"
2216 "Set Hello interval\n"
2217 "Hello interval value\n"
2218 "Holdtime 1 second, interval depends on multiplier\n"
hassof390d2c2004-09-10 20:48:21 +00002219 "Specify hello-interval for level-2 IIHs\n")
jardineb5d44e2003-12-23 08:09:43 +00002220
2221DEFUN (isis_hello_multiplier,
2222 isis_hello_multiplier_cmd,
Josh Bailey3f045a02012-03-24 08:35:20 -07002223 "isis hello-multiplier <2-100>",
jardineb5d44e2003-12-23 08:09:43 +00002224 "IS-IS commands\n"
2225 "Set multiplier for Hello holding time\n"
hassof390d2c2004-09-10 20:48:21 +00002226 "Hello multiplier value\n")
jardineb5d44e2003-12-23 08:09:43 +00002227{
jardineb5d44e2003-12-23 08:09:43 +00002228 int mult;
Josh Bailey3f045a02012-03-24 08:35:20 -07002229 struct isis_circuit *circuit = isis_circuit_lookup (vty);
2230 if (!circuit)
2231 return CMD_ERR_NO_MATCH;
jardineb5d44e2003-12-23 08:09:43 +00002232
2233 mult = atoi (argv[0]);
Josh Bailey3f045a02012-03-24 08:35:20 -07002234 if (mult < MIN_HELLO_MULTIPLIER || mult > MAX_HELLO_MULTIPLIER)
2235 {
2236 vty_out (vty, "Invalid hello-multiplier %d - should be <2-100>%s",
2237 mult, VTY_NEWLINE);
2238 return CMD_ERR_AMBIGUOUS;
2239 }
jardineb5d44e2003-12-23 08:09:43 +00002240
hassof390d2c2004-09-10 20:48:21 +00002241 circuit->hello_multiplier[0] = (u_int16_t) mult;
2242 circuit->hello_multiplier[1] = (u_int16_t) mult;
2243
jardineb5d44e2003-12-23 08:09:43 +00002244 return CMD_SUCCESS;
2245}
2246
2247DEFUN (no_isis_hello_multiplier,
2248 no_isis_hello_multiplier_cmd,
2249 "no isis hello-multiplier",
2250 NO_STR
2251 "IS-IS commands\n"
hassof390d2c2004-09-10 20:48:21 +00002252 "Set multiplier for Hello holding time\n")
jardineb5d44e2003-12-23 08:09:43 +00002253{
Josh Bailey3f045a02012-03-24 08:35:20 -07002254 struct isis_circuit *circuit = isis_circuit_lookup (vty);
2255 if (!circuit)
2256 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00002257
Josh Bailey3f045a02012-03-24 08:35:20 -07002258 circuit->hello_multiplier[0] = DEFAULT_HELLO_MULTIPLIER;
2259 circuit->hello_multiplier[1] = DEFAULT_HELLO_MULTIPLIER;
jardineb5d44e2003-12-23 08:09:43 +00002260
2261 return CMD_SUCCESS;
2262}
2263
2264ALIAS (no_isis_hello_multiplier,
2265 no_isis_hello_multiplier_arg_cmd,
Josh Bailey3f045a02012-03-24 08:35:20 -07002266 "no isis hello-multiplier <2-100>",
jardineb5d44e2003-12-23 08:09:43 +00002267 NO_STR
2268 "IS-IS commands\n"
2269 "Set multiplier for Hello holding time\n"
hassof390d2c2004-09-10 20:48:21 +00002270 "Hello multiplier value\n")
jardineb5d44e2003-12-23 08:09:43 +00002271
2272DEFUN (isis_hello_multiplier_l1,
2273 isis_hello_multiplier_l1_cmd,
Josh Bailey3f045a02012-03-24 08:35:20 -07002274 "isis hello-multiplier <2-100> level-1",
jardineb5d44e2003-12-23 08:09:43 +00002275 "IS-IS commands\n"
2276 "Set multiplier for Hello holding time\n"
2277 "Hello multiplier value\n"
hassof390d2c2004-09-10 20:48:21 +00002278 "Specify hello multiplier for level-1 IIHs\n")
jardineb5d44e2003-12-23 08:09:43 +00002279{
jardineb5d44e2003-12-23 08:09:43 +00002280 int mult;
Josh Bailey3f045a02012-03-24 08:35:20 -07002281 struct isis_circuit *circuit = isis_circuit_lookup (vty);
2282 if (!circuit)
2283 return CMD_ERR_NO_MATCH;
jardineb5d44e2003-12-23 08:09:43 +00002284
2285 mult = atoi (argv[0]);
Josh Bailey3f045a02012-03-24 08:35:20 -07002286 if (mult < MIN_HELLO_MULTIPLIER || mult > MAX_HELLO_MULTIPLIER)
2287 {
2288 vty_out (vty, "Invalid hello-multiplier %d - should be <2-100>%s",
2289 mult, VTY_NEWLINE);
2290 return CMD_ERR_AMBIGUOUS;
2291 }
jardineb5d44e2003-12-23 08:09:43 +00002292
hassof390d2c2004-09-10 20:48:21 +00002293 circuit->hello_multiplier[0] = (u_int16_t) mult;
2294
jardineb5d44e2003-12-23 08:09:43 +00002295 return CMD_SUCCESS;
2296}
2297
2298DEFUN (no_isis_hello_multiplier_l1,
2299 no_isis_hello_multiplier_l1_cmd,
2300 "no isis hello-multiplier level-1",
2301 NO_STR
2302 "IS-IS commands\n"
2303 "Set multiplier for Hello holding time\n"
hassof390d2c2004-09-10 20:48:21 +00002304 "Specify hello multiplier for level-1 IIHs\n")
jardineb5d44e2003-12-23 08:09:43 +00002305{
Josh Bailey3f045a02012-03-24 08:35:20 -07002306 struct isis_circuit *circuit = isis_circuit_lookup (vty);
2307 if (!circuit)
2308 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00002309
Josh Bailey3f045a02012-03-24 08:35:20 -07002310 circuit->hello_multiplier[0] = DEFAULT_HELLO_MULTIPLIER;
jardineb5d44e2003-12-23 08:09:43 +00002311
2312 return CMD_SUCCESS;
2313}
2314
2315ALIAS (no_isis_hello_multiplier_l1,
2316 no_isis_hello_multiplier_l1_arg_cmd,
Josh Bailey3f045a02012-03-24 08:35:20 -07002317 "no isis hello-multiplier <2-100> level-1",
jardineb5d44e2003-12-23 08:09:43 +00002318 NO_STR
2319 "IS-IS commands\n"
2320 "Set multiplier for Hello holding time\n"
2321 "Hello multiplier value\n"
hassof390d2c2004-09-10 20:48:21 +00002322 "Specify hello multiplier for level-1 IIHs\n")
jardineb5d44e2003-12-23 08:09:43 +00002323
2324DEFUN (isis_hello_multiplier_l2,
2325 isis_hello_multiplier_l2_cmd,
Josh Bailey3f045a02012-03-24 08:35:20 -07002326 "isis hello-multiplier <2-100> level-2",
jardineb5d44e2003-12-23 08:09:43 +00002327 "IS-IS commands\n"
2328 "Set multiplier for Hello holding time\n"
2329 "Hello multiplier value\n"
hassof390d2c2004-09-10 20:48:21 +00002330 "Specify hello multiplier for level-2 IIHs\n")
jardineb5d44e2003-12-23 08:09:43 +00002331{
jardineb5d44e2003-12-23 08:09:43 +00002332 int mult;
Josh Bailey3f045a02012-03-24 08:35:20 -07002333 struct isis_circuit *circuit = isis_circuit_lookup (vty);
2334 if (!circuit)
2335 return CMD_ERR_NO_MATCH;
jardineb5d44e2003-12-23 08:09:43 +00002336
2337 mult = atoi (argv[0]);
Josh Bailey3f045a02012-03-24 08:35:20 -07002338 if (mult < MIN_HELLO_MULTIPLIER || mult > MAX_HELLO_MULTIPLIER)
2339 {
2340 vty_out (vty, "Invalid hello-multiplier %d - should be <2-100>%s",
2341 mult, VTY_NEWLINE);
2342 return CMD_ERR_AMBIGUOUS;
2343 }
jardineb5d44e2003-12-23 08:09:43 +00002344
hassof390d2c2004-09-10 20:48:21 +00002345 circuit->hello_multiplier[1] = (u_int16_t) mult;
2346
jardineb5d44e2003-12-23 08:09:43 +00002347 return CMD_SUCCESS;
2348}
2349
2350DEFUN (no_isis_hello_multiplier_l2,
2351 no_isis_hello_multiplier_l2_cmd,
2352 "no isis hello-multiplier level-2",
2353 NO_STR
2354 "IS-IS commands\n"
2355 "Set multiplier for Hello holding time\n"
hassof390d2c2004-09-10 20:48:21 +00002356 "Specify hello multiplier for level-2 IIHs\n")
jardineb5d44e2003-12-23 08:09:43 +00002357{
Josh Bailey3f045a02012-03-24 08:35:20 -07002358 struct isis_circuit *circuit = isis_circuit_lookup (vty);
2359 if (!circuit)
2360 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00002361
Josh Bailey3f045a02012-03-24 08:35:20 -07002362 circuit->hello_multiplier[1] = DEFAULT_HELLO_MULTIPLIER;
jardineb5d44e2003-12-23 08:09:43 +00002363
2364 return CMD_SUCCESS;
2365}
2366
2367ALIAS (no_isis_hello_multiplier_l2,
2368 no_isis_hello_multiplier_l2_arg_cmd,
Josh Bailey3f045a02012-03-24 08:35:20 -07002369 "no isis hello-multiplier <2-100> level-2",
jardineb5d44e2003-12-23 08:09:43 +00002370 NO_STR
2371 "IS-IS commands\n"
2372 "Set multiplier for Hello holding time\n"
2373 "Hello multiplier value\n"
hassof390d2c2004-09-10 20:48:21 +00002374 "Specify hello multiplier for level-2 IIHs\n")
jardineb5d44e2003-12-23 08:09:43 +00002375
Josh Bailey3f045a02012-03-24 08:35:20 -07002376DEFUN (isis_hello_padding,
2377 isis_hello_padding_cmd,
jardineb5d44e2003-12-23 08:09:43 +00002378 "isis hello padding",
2379 "IS-IS commands\n"
2380 "Add padding to IS-IS hello packets\n"
2381 "Pad hello packets\n"
2382 "<cr>\n")
2383{
Josh Bailey3f045a02012-03-24 08:35:20 -07002384 struct isis_circuit *circuit = isis_circuit_lookup (vty);
2385 if (!circuit)
2386 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00002387
Josh Bailey3f045a02012-03-24 08:35:20 -07002388 circuit->pad_hellos = 1;
hassof390d2c2004-09-10 20:48:21 +00002389
jardineb5d44e2003-12-23 08:09:43 +00002390 return CMD_SUCCESS;
2391}
2392
Josh Bailey3f045a02012-03-24 08:35:20 -07002393DEFUN (no_isis_hello_padding,
2394 no_isis_hello_padding_cmd,
jardineb5d44e2003-12-23 08:09:43 +00002395 "no isis hello padding",
2396 NO_STR
2397 "IS-IS commands\n"
2398 "Add padding to IS-IS hello packets\n"
2399 "Pad hello packets\n"
2400 "<cr>\n")
2401{
Josh Bailey3f045a02012-03-24 08:35:20 -07002402 struct isis_circuit *circuit = isis_circuit_lookup (vty);
2403 if (!circuit)
2404 return CMD_ERR_NO_MATCH;
jardineb5d44e2003-12-23 08:09:43 +00002405
Josh Bailey3f045a02012-03-24 08:35:20 -07002406 circuit->pad_hellos = 0;
hassof390d2c2004-09-10 20:48:21 +00002407
jardineb5d44e2003-12-23 08:09:43 +00002408 return CMD_SUCCESS;
2409}
2410
2411DEFUN (csnp_interval,
2412 csnp_interval_cmd,
Josh Bailey3f045a02012-03-24 08:35:20 -07002413 "isis csnp-interval <1-600>",
jardineb5d44e2003-12-23 08:09:43 +00002414 "IS-IS commands\n"
2415 "Set CSNP interval in seconds\n"
2416 "CSNP interval value\n")
2417{
jardineb5d44e2003-12-23 08:09:43 +00002418 unsigned long interval;
Josh Bailey3f045a02012-03-24 08:35:20 -07002419 struct isis_circuit *circuit = isis_circuit_lookup (vty);
2420 if (!circuit)
2421 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00002422
jardineb5d44e2003-12-23 08:09:43 +00002423 interval = atol (argv[0]);
Josh Bailey3f045a02012-03-24 08:35:20 -07002424 if (interval < MIN_CSNP_INTERVAL || interval > MAX_CSNP_INTERVAL)
2425 {
2426 vty_out (vty, "Invalid csnp-interval %lu - should be <1-600>%s",
2427 interval, VTY_NEWLINE);
2428 return CMD_ERR_AMBIGUOUS;
2429 }
jardineb5d44e2003-12-23 08:09:43 +00002430
hassof390d2c2004-09-10 20:48:21 +00002431 circuit->csnp_interval[0] = (u_int16_t) interval;
2432 circuit->csnp_interval[1] = (u_int16_t) interval;
2433
jardineb5d44e2003-12-23 08:09:43 +00002434 return CMD_SUCCESS;
2435}
2436
2437DEFUN (no_csnp_interval,
2438 no_csnp_interval_cmd,
2439 "no isis csnp-interval",
2440 NO_STR
2441 "IS-IS commands\n"
hassof390d2c2004-09-10 20:48:21 +00002442 "Set CSNP interval in seconds\n")
jardineb5d44e2003-12-23 08:09:43 +00002443{
Josh Bailey3f045a02012-03-24 08:35:20 -07002444 struct isis_circuit *circuit = isis_circuit_lookup (vty);
2445 if (!circuit)
2446 return CMD_ERR_NO_MATCH;
jardineb5d44e2003-12-23 08:09:43 +00002447
Josh Bailey3f045a02012-03-24 08:35:20 -07002448 circuit->csnp_interval[0] = DEFAULT_CSNP_INTERVAL;
2449 circuit->csnp_interval[1] = DEFAULT_CSNP_INTERVAL;
hassof390d2c2004-09-10 20:48:21 +00002450
jardineb5d44e2003-12-23 08:09:43 +00002451 return CMD_SUCCESS;
2452}
2453
2454ALIAS (no_csnp_interval,
2455 no_csnp_interval_arg_cmd,
Josh Bailey3f045a02012-03-24 08:35:20 -07002456 "no isis csnp-interval <1-600>",
jardineb5d44e2003-12-23 08:09:43 +00002457 NO_STR
2458 "IS-IS commands\n"
2459 "Set CSNP interval in seconds\n"
2460 "CSNP interval value\n")
2461
jardineb5d44e2003-12-23 08:09:43 +00002462DEFUN (csnp_interval_l1,
2463 csnp_interval_l1_cmd,
Josh Bailey3f045a02012-03-24 08:35:20 -07002464 "isis csnp-interval <1-600> level-1",
jardineb5d44e2003-12-23 08:09:43 +00002465 "IS-IS commands\n"
2466 "Set CSNP interval in seconds\n"
2467 "CSNP interval value\n"
2468 "Specify interval for level-1 CSNPs\n")
2469{
jardineb5d44e2003-12-23 08:09:43 +00002470 unsigned long interval;
Josh Bailey3f045a02012-03-24 08:35:20 -07002471 struct isis_circuit *circuit = isis_circuit_lookup (vty);
2472 if (!circuit)
2473 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00002474
jardineb5d44e2003-12-23 08:09:43 +00002475 interval = atol (argv[0]);
Josh Bailey3f045a02012-03-24 08:35:20 -07002476 if (interval < MIN_CSNP_INTERVAL || interval > MAX_CSNP_INTERVAL)
2477 {
2478 vty_out (vty, "Invalid csnp-interval %lu - should be <1-600>%s",
2479 interval, VTY_NEWLINE);
2480 return CMD_ERR_AMBIGUOUS;
2481 }
hassof390d2c2004-09-10 20:48:21 +00002482
2483 circuit->csnp_interval[0] = (u_int16_t) interval;
2484
jardineb5d44e2003-12-23 08:09:43 +00002485 return CMD_SUCCESS;
2486}
2487
2488DEFUN (no_csnp_interval_l1,
2489 no_csnp_interval_l1_cmd,
2490 "no isis csnp-interval level-1",
2491 NO_STR
2492 "IS-IS commands\n"
2493 "Set CSNP interval in seconds\n"
2494 "Specify interval for level-1 CSNPs\n")
2495{
Josh Bailey3f045a02012-03-24 08:35:20 -07002496 struct isis_circuit *circuit = isis_circuit_lookup (vty);
2497 if (!circuit)
2498 return CMD_ERR_NO_MATCH;
jardineb5d44e2003-12-23 08:09:43 +00002499
Josh Bailey3f045a02012-03-24 08:35:20 -07002500 circuit->csnp_interval[0] = DEFAULT_CSNP_INTERVAL;
hassof390d2c2004-09-10 20:48:21 +00002501
jardineb5d44e2003-12-23 08:09:43 +00002502 return CMD_SUCCESS;
2503}
2504
2505ALIAS (no_csnp_interval_l1,
2506 no_csnp_interval_l1_arg_cmd,
Josh Bailey3f045a02012-03-24 08:35:20 -07002507 "no isis csnp-interval <1-600> level-1",
jardineb5d44e2003-12-23 08:09:43 +00002508 NO_STR
2509 "IS-IS commands\n"
2510 "Set CSNP interval in seconds\n"
2511 "CSNP interval value\n"
2512 "Specify interval for level-1 CSNPs\n")
2513
jardineb5d44e2003-12-23 08:09:43 +00002514DEFUN (csnp_interval_l2,
2515 csnp_interval_l2_cmd,
Josh Bailey3f045a02012-03-24 08:35:20 -07002516 "isis csnp-interval <1-600> level-2",
jardineb5d44e2003-12-23 08:09:43 +00002517 "IS-IS commands\n"
2518 "Set CSNP interval in seconds\n"
2519 "CSNP interval value\n"
2520 "Specify interval for level-2 CSNPs\n")
2521{
jardineb5d44e2003-12-23 08:09:43 +00002522 unsigned long interval;
Josh Bailey3f045a02012-03-24 08:35:20 -07002523 struct isis_circuit *circuit = isis_circuit_lookup (vty);
2524 if (!circuit)
2525 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00002526
jardineb5d44e2003-12-23 08:09:43 +00002527 interval = atol (argv[0]);
Josh Bailey3f045a02012-03-24 08:35:20 -07002528 if (interval < MIN_CSNP_INTERVAL || interval > MAX_CSNP_INTERVAL)
2529 {
2530 vty_out (vty, "Invalid csnp-interval %lu - should be <1-600>%s",
2531 interval, VTY_NEWLINE);
2532 return CMD_ERR_AMBIGUOUS;
2533 }
hassof390d2c2004-09-10 20:48:21 +00002534
2535 circuit->csnp_interval[1] = (u_int16_t) interval;
2536
jardineb5d44e2003-12-23 08:09:43 +00002537 return CMD_SUCCESS;
2538}
2539
2540DEFUN (no_csnp_interval_l2,
2541 no_csnp_interval_l2_cmd,
2542 "no isis csnp-interval level-2",
2543 NO_STR
2544 "IS-IS commands\n"
2545 "Set CSNP interval in seconds\n"
2546 "Specify interval for level-2 CSNPs\n")
2547{
Josh Bailey3f045a02012-03-24 08:35:20 -07002548 struct isis_circuit *circuit = isis_circuit_lookup (vty);
2549 if (!circuit)
2550 return CMD_ERR_NO_MATCH;
jardineb5d44e2003-12-23 08:09:43 +00002551
Josh Bailey3f045a02012-03-24 08:35:20 -07002552 circuit->csnp_interval[1] = DEFAULT_CSNP_INTERVAL;
hassof390d2c2004-09-10 20:48:21 +00002553
jardineb5d44e2003-12-23 08:09:43 +00002554 return CMD_SUCCESS;
2555}
2556
2557ALIAS (no_csnp_interval_l2,
2558 no_csnp_interval_l2_arg_cmd,
Josh Bailey3f045a02012-03-24 08:35:20 -07002559 "no isis csnp-interval <1-600> level-2",
jardineb5d44e2003-12-23 08:09:43 +00002560 NO_STR
2561 "IS-IS commands\n"
2562 "Set CSNP interval in seconds\n"
2563 "CSNP interval value\n"
2564 "Specify interval for level-2 CSNPs\n")
2565
Josh Bailey3f045a02012-03-24 08:35:20 -07002566DEFUN (psnp_interval,
2567 psnp_interval_cmd,
2568 "isis psnp-interval <1-120>",
2569 "IS-IS commands\n"
2570 "Set PSNP interval in seconds\n"
2571 "PSNP interval value\n")
jardineb5d44e2003-12-23 08:09:43 +00002572{
Josh Bailey3f045a02012-03-24 08:35:20 -07002573 unsigned long interval;
2574 struct isis_circuit *circuit = isis_circuit_lookup (vty);
2575 if (!circuit)
2576 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00002577
Josh Bailey3f045a02012-03-24 08:35:20 -07002578 interval = atol (argv[0]);
2579 if (interval < MIN_PSNP_INTERVAL || interval > MAX_PSNP_INTERVAL)
hassof390d2c2004-09-10 20:48:21 +00002580 {
Josh Bailey3f045a02012-03-24 08:35:20 -07002581 vty_out (vty, "Invalid psnp-interval %lu - should be <1-120>%s",
2582 interval, VTY_NEWLINE);
2583 return CMD_ERR_AMBIGUOUS;
jardineb5d44e2003-12-23 08:09:43 +00002584 }
jardineb5d44e2003-12-23 08:09:43 +00002585
Josh Bailey3f045a02012-03-24 08:35:20 -07002586 circuit->psnp_interval[0] = (u_int16_t) interval;
2587 circuit->psnp_interval[1] = (u_int16_t) interval;
jardineb5d44e2003-12-23 08:09:43 +00002588
2589 return CMD_SUCCESS;
2590}
2591
Josh Bailey3f045a02012-03-24 08:35:20 -07002592DEFUN (no_psnp_interval,
2593 no_psnp_interval_cmd,
2594 "no isis psnp-interval",
jardineb5d44e2003-12-23 08:09:43 +00002595 NO_STR
Josh Bailey3f045a02012-03-24 08:35:20 -07002596 "IS-IS commands\n"
2597 "Set PSNP interval in seconds\n")
jardineb5d44e2003-12-23 08:09:43 +00002598{
Josh Bailey3f045a02012-03-24 08:35:20 -07002599 struct isis_circuit *circuit = isis_circuit_lookup (vty);
2600 if (!circuit)
2601 return CMD_ERR_NO_MATCH;
hassof390d2c2004-09-10 20:48:21 +00002602
Josh Bailey3f045a02012-03-24 08:35:20 -07002603 circuit->psnp_interval[0] = DEFAULT_PSNP_INTERVAL;
2604 circuit->psnp_interval[1] = DEFAULT_PSNP_INTERVAL;
jardineb5d44e2003-12-23 08:09:43 +00002605
2606 return CMD_SUCCESS;
2607}
jardineb5d44e2003-12-23 08:09:43 +00002608
Josh Bailey3f045a02012-03-24 08:35:20 -07002609ALIAS (no_psnp_interval,
2610 no_psnp_interval_arg_cmd,
2611 "no isis psnp-interval <1-120>",
2612 NO_STR
2613 "IS-IS commands\n"
2614 "Set PSNP interval in seconds\n"
2615 "PSNP interval value\n")
2616
2617DEFUN (psnp_interval_l1,
2618 psnp_interval_l1_cmd,
2619 "isis psnp-interval <1-120> level-1",
2620 "IS-IS commands\n"
2621 "Set PSNP interval in seconds\n"
2622 "PSNP interval value\n"
2623 "Specify interval for level-1 PSNPs\n")
2624{
2625 unsigned long interval;
2626 struct isis_circuit *circuit = isis_circuit_lookup (vty);
2627 if (!circuit)
2628 return CMD_ERR_NO_MATCH;
2629
2630 interval = atol (argv[0]);
2631 if (interval < MIN_PSNP_INTERVAL || interval > MAX_PSNP_INTERVAL)
2632 {
2633 vty_out (vty, "Invalid psnp-interval %lu - should be <1-120>%s",
2634 interval, VTY_NEWLINE);
2635 return CMD_ERR_AMBIGUOUS;
2636 }
2637
2638 circuit->psnp_interval[0] = (u_int16_t) interval;
2639
2640 return CMD_SUCCESS;
2641}
2642
2643DEFUN (no_psnp_interval_l1,
2644 no_psnp_interval_l1_cmd,
2645 "no isis psnp-interval level-1",
2646 NO_STR
2647 "IS-IS commands\n"
2648 "Set PSNP interval in seconds\n"
2649 "Specify interval for level-1 PSNPs\n")
2650{
2651 struct isis_circuit *circuit = isis_circuit_lookup (vty);
2652 if (!circuit)
2653 return CMD_ERR_NO_MATCH;
2654
2655 circuit->psnp_interval[0] = DEFAULT_PSNP_INTERVAL;
2656
2657 return CMD_SUCCESS;
2658}
2659
2660ALIAS (no_psnp_interval_l1,
2661 no_psnp_interval_l1_arg_cmd,
2662 "no isis psnp-interval <1-120> level-1",
2663 NO_STR
2664 "IS-IS commands\n"
2665 "Set PSNP interval in seconds\n"
2666 "PSNP interval value\n"
2667 "Specify interval for level-1 PSNPs\n")
2668
2669DEFUN (psnp_interval_l2,
2670 psnp_interval_l2_cmd,
2671 "isis psnp-interval <1-120> level-2",
2672 "IS-IS commands\n"
2673 "Set PSNP interval in seconds\n"
2674 "PSNP interval value\n"
2675 "Specify interval for level-2 PSNPs\n")
2676{
2677 unsigned long interval;
2678 struct isis_circuit *circuit = isis_circuit_lookup (vty);
2679 if (!circuit)
2680 return CMD_ERR_NO_MATCH;
2681
2682 interval = atol (argv[0]);
2683 if (interval < MIN_PSNP_INTERVAL || interval > MAX_PSNP_INTERVAL)
2684 {
2685 vty_out (vty, "Invalid psnp-interval %lu - should be <1-120>%s",
2686 interval, VTY_NEWLINE);
2687 return CMD_ERR_AMBIGUOUS;
2688 }
2689
2690 circuit->psnp_interval[1] = (u_int16_t) interval;
2691
2692 return CMD_SUCCESS;
2693}
2694
2695DEFUN (no_psnp_interval_l2,
2696 no_psnp_interval_l2_cmd,
2697 "no isis psnp-interval level-2",
2698 NO_STR
2699 "IS-IS commands\n"
2700 "Set PSNP interval in seconds\n"
2701 "Specify interval for level-2 PSNPs\n")
2702{
2703 struct isis_circuit *circuit = isis_circuit_lookup (vty);
2704 if (!circuit)
2705 return CMD_ERR_NO_MATCH;
2706
2707 circuit->psnp_interval[1] = DEFAULT_PSNP_INTERVAL;
2708
2709 return CMD_SUCCESS;
2710}
2711
2712ALIAS (no_psnp_interval_l2,
2713 no_psnp_interval_l2_arg_cmd,
2714 "no isis psnp-interval <1-120> level-2",
2715 NO_STR
2716 "IS-IS commands\n"
2717 "Set PSNP interval in seconds\n"
2718 "PSNP interval value\n"
2719 "Specify interval for level-2 PSNPs\n")
2720
2721struct cmd_node interface_node = {
jardineb5d44e2003-12-23 08:09:43 +00002722 INTERFACE_NODE,
2723 "%s(config-if)# ",
2724 1,
2725};
2726
Josh Bailey3f045a02012-03-24 08:35:20 -07002727DEFUN (isis_network,
2728 isis_network_cmd,
2729 "isis network point-to-point",
2730 "IS-IS commands\n"
2731 "Set network type\n"
2732 "point-to-point network type\n")
2733{
2734 struct isis_circuit *circuit = isis_circuit_lookup (vty);
2735 if (!circuit)
2736 return CMD_ERR_NO_MATCH;
2737
2738 /* RFC5309 section 4 */
2739 if (circuit->circ_type == CIRCUIT_T_P2P)
2740 return CMD_SUCCESS;
2741
2742 if (circuit->state != C_STATE_UP)
2743 {
2744 circuit->circ_type = CIRCUIT_T_P2P;
2745 circuit->circ_type_config = CIRCUIT_T_P2P;
2746 }
2747 else
2748 {
2749 struct isis_area *area = circuit->area;
2750 if (!if_is_broadcast (circuit->interface))
2751 {
2752 vty_out (vty, "isis network point-to-point "
2753 "is valid only on broadcast interfaces%s",
2754 VTY_NEWLINE);
2755 return CMD_ERR_AMBIGUOUS;
2756 }
2757
2758 isis_csm_state_change (ISIS_DISABLE, circuit, area);
2759 circuit->circ_type = CIRCUIT_T_P2P;
2760 circuit->circ_type_config = CIRCUIT_T_P2P;
2761 isis_csm_state_change (ISIS_ENABLE, circuit, area);
2762 }
2763
2764 return CMD_SUCCESS;
2765}
2766
2767DEFUN (no_isis_network,
2768 no_isis_network_cmd,
2769 "no isis network point-to-point",
2770 NO_STR
2771 "IS-IS commands\n"
2772 "Set network type for circuit\n"
2773 "point-to-point network type\n")
2774{
2775 struct isis_circuit *circuit = isis_circuit_lookup (vty);
2776 if (!circuit)
2777 return CMD_ERR_NO_MATCH;
2778
2779 /* RFC5309 section 4 */
2780 if (circuit->circ_type == CIRCUIT_T_BROADCAST)
2781 return CMD_SUCCESS;
2782
2783 if (circuit->state != C_STATE_UP)
2784 {
2785 circuit->circ_type = CIRCUIT_T_BROADCAST;
2786 circuit->circ_type_config = CIRCUIT_T_BROADCAST;
2787 }
2788 else
2789 {
2790 struct isis_area *area = circuit->area;
2791 if (circuit->interface &&
2792 !if_is_broadcast (circuit->interface))
2793 {
2794 vty_out (vty, "no isis network point-to-point "
2795 "is valid only on broadcast interfaces%s",
2796 VTY_NEWLINE);
2797 return CMD_ERR_AMBIGUOUS;
2798 }
2799
2800 isis_csm_state_change (ISIS_DISABLE, circuit, area);
2801 circuit->circ_type = CIRCUIT_T_BROADCAST;
2802 circuit->circ_type_config = CIRCUIT_T_BROADCAST;
2803 isis_csm_state_change (ISIS_ENABLE, circuit, area);
2804 }
2805
2806 return CMD_SUCCESS;
2807}
2808
jardineb5d44e2003-12-23 08:09:43 +00002809int
2810isis_if_new_hook (struct interface *ifp)
2811{
jardineb5d44e2003-12-23 08:09:43 +00002812 return 0;
2813}
2814
2815int
2816isis_if_delete_hook (struct interface *ifp)
2817{
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002818 struct isis_circuit *circuit;
2819 /* Clean up the circuit data */
2820 if (ifp && ifp->info)
2821 {
2822 circuit = ifp->info;
2823 isis_csm_state_change (IF_DOWN_FROM_Z, circuit, circuit->area);
2824 isis_csm_state_change (ISIS_DISABLE, circuit, circuit->area);
2825 }
2826
jardineb5d44e2003-12-23 08:09:43 +00002827 return 0;
2828}
2829
jardineb5d44e2003-12-23 08:09:43 +00002830void
2831isis_circuit_init ()
2832{
jardineb5d44e2003-12-23 08:09:43 +00002833 /* Initialize Zebra interface data structure */
jardineb5d44e2003-12-23 08:09:43 +00002834 if_add_hook (IF_NEW_HOOK, isis_if_new_hook);
2835 if_add_hook (IF_DELETE_HOOK, isis_if_delete_hook);
2836
2837 /* Install interface node */
2838 install_node (&interface_node, isis_interface_config_write);
2839 install_element (CONFIG_NODE, &interface_cmd);
Subbaiah Venkatae38e0df2012-03-27 23:48:05 -07002840 install_element (CONFIG_NODE, &no_interface_cmd);
jardineb5d44e2003-12-23 08:09:43 +00002841
2842 install_default (INTERFACE_NODE);
2843 install_element (INTERFACE_NODE, &interface_desc_cmd);
2844 install_element (INTERFACE_NODE, &no_interface_desc_cmd);
2845
2846 install_element (INTERFACE_NODE, &ip_router_isis_cmd);
2847 install_element (INTERFACE_NODE, &no_ip_router_isis_cmd);
2848
Josh Bailey3f045a02012-03-24 08:35:20 -07002849 install_element (INTERFACE_NODE, &isis_passive_cmd);
2850 install_element (INTERFACE_NODE, &no_isis_passive_cmd);
2851
jardineb5d44e2003-12-23 08:09:43 +00002852 install_element (INTERFACE_NODE, &isis_circuit_type_cmd);
2853 install_element (INTERFACE_NODE, &no_isis_circuit_type_cmd);
2854
Josh Bailey3f045a02012-03-24 08:35:20 -07002855 install_element (INTERFACE_NODE, &isis_passwd_clear_cmd);
2856 install_element (INTERFACE_NODE, &isis_passwd_md5_cmd);
jardineb5d44e2003-12-23 08:09:43 +00002857 install_element (INTERFACE_NODE, &no_isis_passwd_cmd);
2858
2859 install_element (INTERFACE_NODE, &isis_priority_cmd);
2860 install_element (INTERFACE_NODE, &no_isis_priority_cmd);
2861 install_element (INTERFACE_NODE, &no_isis_priority_arg_cmd);
2862 install_element (INTERFACE_NODE, &isis_priority_l1_cmd);
2863 install_element (INTERFACE_NODE, &no_isis_priority_l1_cmd);
2864 install_element (INTERFACE_NODE, &no_isis_priority_l1_arg_cmd);
2865 install_element (INTERFACE_NODE, &isis_priority_l2_cmd);
2866 install_element (INTERFACE_NODE, &no_isis_priority_l2_cmd);
2867 install_element (INTERFACE_NODE, &no_isis_priority_l2_arg_cmd);
2868
2869 install_element (INTERFACE_NODE, &isis_metric_cmd);
2870 install_element (INTERFACE_NODE, &no_isis_metric_cmd);
2871 install_element (INTERFACE_NODE, &no_isis_metric_arg_cmd);
Josh Bailey3f045a02012-03-24 08:35:20 -07002872 install_element (INTERFACE_NODE, &isis_metric_l1_cmd);
2873 install_element (INTERFACE_NODE, &no_isis_metric_l1_cmd);
2874 install_element (INTERFACE_NODE, &no_isis_metric_l1_arg_cmd);
2875 install_element (INTERFACE_NODE, &isis_metric_l2_cmd);
2876 install_element (INTERFACE_NODE, &no_isis_metric_l2_cmd);
2877 install_element (INTERFACE_NODE, &no_isis_metric_l2_arg_cmd);
jardineb5d44e2003-12-23 08:09:43 +00002878
2879 install_element (INTERFACE_NODE, &isis_hello_interval_cmd);
2880 install_element (INTERFACE_NODE, &no_isis_hello_interval_cmd);
2881 install_element (INTERFACE_NODE, &no_isis_hello_interval_arg_cmd);
2882 install_element (INTERFACE_NODE, &isis_hello_interval_l1_cmd);
2883 install_element (INTERFACE_NODE, &no_isis_hello_interval_l1_cmd);
2884 install_element (INTERFACE_NODE, &no_isis_hello_interval_l1_arg_cmd);
2885 install_element (INTERFACE_NODE, &isis_hello_interval_l2_cmd);
2886 install_element (INTERFACE_NODE, &no_isis_hello_interval_l2_cmd);
2887 install_element (INTERFACE_NODE, &no_isis_hello_interval_l2_arg_cmd);
2888
2889 install_element (INTERFACE_NODE, &isis_hello_multiplier_cmd);
2890 install_element (INTERFACE_NODE, &no_isis_hello_multiplier_cmd);
2891 install_element (INTERFACE_NODE, &no_isis_hello_multiplier_arg_cmd);
2892 install_element (INTERFACE_NODE, &isis_hello_multiplier_l1_cmd);
2893 install_element (INTERFACE_NODE, &no_isis_hello_multiplier_l1_cmd);
2894 install_element (INTERFACE_NODE, &no_isis_hello_multiplier_l1_arg_cmd);
2895 install_element (INTERFACE_NODE, &isis_hello_multiplier_l2_cmd);
2896 install_element (INTERFACE_NODE, &no_isis_hello_multiplier_l2_cmd);
2897 install_element (INTERFACE_NODE, &no_isis_hello_multiplier_l2_arg_cmd);
2898
Josh Bailey3f045a02012-03-24 08:35:20 -07002899 install_element (INTERFACE_NODE, &isis_hello_padding_cmd);
2900 install_element (INTERFACE_NODE, &no_isis_hello_padding_cmd);
2901
jardineb5d44e2003-12-23 08:09:43 +00002902 install_element (INTERFACE_NODE, &csnp_interval_cmd);
2903 install_element (INTERFACE_NODE, &no_csnp_interval_cmd);
2904 install_element (INTERFACE_NODE, &no_csnp_interval_arg_cmd);
2905 install_element (INTERFACE_NODE, &csnp_interval_l1_cmd);
2906 install_element (INTERFACE_NODE, &no_csnp_interval_l1_cmd);
2907 install_element (INTERFACE_NODE, &no_csnp_interval_l1_arg_cmd);
2908 install_element (INTERFACE_NODE, &csnp_interval_l2_cmd);
2909 install_element (INTERFACE_NODE, &no_csnp_interval_l2_cmd);
2910 install_element (INTERFACE_NODE, &no_csnp_interval_l2_arg_cmd);
2911
Josh Bailey3f045a02012-03-24 08:35:20 -07002912 install_element (INTERFACE_NODE, &psnp_interval_cmd);
2913 install_element (INTERFACE_NODE, &no_psnp_interval_cmd);
2914 install_element (INTERFACE_NODE, &no_psnp_interval_arg_cmd);
2915 install_element (INTERFACE_NODE, &psnp_interval_l1_cmd);
2916 install_element (INTERFACE_NODE, &no_psnp_interval_l1_cmd);
2917 install_element (INTERFACE_NODE, &no_psnp_interval_l1_arg_cmd);
2918 install_element (INTERFACE_NODE, &psnp_interval_l2_cmd);
2919 install_element (INTERFACE_NODE, &no_psnp_interval_l2_cmd);
2920 install_element (INTERFACE_NODE, &no_psnp_interval_l2_arg_cmd);
2921
2922 install_element (INTERFACE_NODE, &isis_network_cmd);
2923 install_element (INTERFACE_NODE, &no_isis_network_cmd);
2924
jardineb5d44e2003-12-23 08:09:43 +00002925#ifdef HAVE_IPV6
2926 install_element (INTERFACE_NODE, &ipv6_router_isis_cmd);
2927 install_element (INTERFACE_NODE, &no_ipv6_router_isis_cmd);
jardineb5d44e2003-12-23 08:09:43 +00002928#endif
jardineb5d44e2003-12-23 08:09:43 +00002929}