Annotation of embedaddon/quagga/isisd/isis_circuit.c, revision 1.1.1.3
1.1 misho 1: /*
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: */
22: #include <zebra.h>
23: #ifdef GNU_LINUX
24: #include <net/ethernet.h>
25: #else
26: #include <netinet/if_ether.h>
27: #endif
28:
29: #ifndef ETHER_ADDR_LEN
30: #define ETHER_ADDR_LEN ETHERADDRL
31: #endif
32:
33: #include "log.h"
34: #include "memory.h"
35: #include "if.h"
36: #include "linklist.h"
37: #include "command.h"
38: #include "thread.h"
39: #include "hash.h"
40: #include "prefix.h"
41: #include "stream.h"
42:
43: #include "isisd/dict.h"
44: #include "isisd/include-netbsd/iso.h"
45: #include "isisd/isis_constants.h"
46: #include "isisd/isis_common.h"
1.1.1.2 misho 47: #include "isisd/isis_flags.h"
1.1 misho 48: #include "isisd/isis_circuit.h"
49: #include "isisd/isis_tlv.h"
50: #include "isisd/isis_lsp.h"
51: #include "isisd/isis_pdu.h"
52: #include "isisd/isis_network.h"
53: #include "isisd/isis_misc.h"
54: #include "isisd/isis_constants.h"
55: #include "isisd/isis_adjacency.h"
56: #include "isisd/isis_dr.h"
57: #include "isisd/isisd.h"
58: #include "isisd/isis_csm.h"
59: #include "isisd/isis_events.h"
60:
61: /*
62: * Prototypes.
63: */
64: int isis_interface_config_write(struct vty *);
65: int isis_if_new_hook(struct interface *);
66: int isis_if_delete_hook(struct interface *);
67:
68: struct isis_circuit *
69: isis_circuit_new ()
70: {
71: struct isis_circuit *circuit;
72: int i;
73:
74: circuit = XCALLOC (MTYPE_ISIS_CIRCUIT, sizeof (struct isis_circuit));
1.1.1.2 misho 75: if (circuit == NULL)
1.1 misho 76: {
77: zlog_err ("Can't malloc isis circuit");
78: return NULL;
79: }
80:
1.1.1.2 misho 81: /*
82: * Default values
83: */
84: circuit->is_type = IS_LEVEL_1_AND_2;
85: circuit->flags = 0;
86: circuit->pad_hellos = 1;
87: for (i = 0; i < 2; i++)
88: {
89: circuit->hello_interval[i] = DEFAULT_HELLO_INTERVAL;
90: circuit->hello_multiplier[i] = DEFAULT_HELLO_MULTIPLIER;
91: circuit->csnp_interval[i] = DEFAULT_CSNP_INTERVAL;
92: circuit->psnp_interval[i] = DEFAULT_PSNP_INTERVAL;
93: circuit->priority[i] = DEFAULT_PRIORITY;
94: circuit->metrics[i].metric_default = DEFAULT_CIRCUIT_METRIC;
95: circuit->metrics[i].metric_expense = METRICS_UNSUPPORTED;
96: circuit->metrics[i].metric_error = METRICS_UNSUPPORTED;
97: circuit->metrics[i].metric_delay = METRICS_UNSUPPORTED;
98: circuit->te_metric[i] = DEFAULT_CIRCUIT_METRIC;
99: }
100:
1.1 misho 101: return circuit;
102: }
103:
104: void
1.1.1.2 misho 105: isis_circuit_del (struct isis_circuit *circuit)
106: {
107: if (!circuit)
108: return;
109:
110: isis_circuit_if_unbind (circuit, circuit->interface);
111:
112: /* and lastly the circuit itself */
113: XFREE (MTYPE_ISIS_CIRCUIT, circuit);
114:
115: return;
116: }
117:
118: void
1.1 misho 119: isis_circuit_configure (struct isis_circuit *circuit, struct isis_area *area)
120: {
1.1.1.2 misho 121: assert (area);
1.1 misho 122: circuit->area = area;
1.1.1.2 misho 123:
1.1 misho 124: /*
125: * The level for the circuit is same as for the area, unless configured
126: * otherwise.
127: */
1.1.1.2 misho 128: if (area->is_type != IS_LEVEL_1_AND_2 && area->is_type != circuit->is_type)
129: zlog_warn ("circut %s is_type %d mismatch with area %s is_type %d",
130: circuit->interface->name, circuit->is_type,
131: circuit->area->area_tag, area->is_type);
1.1 misho 132:
133: /*
134: * Add the circuit into area
135: */
136: listnode_add (area->circuit_list, circuit);
137:
138: circuit->idx = flags_get_index (&area->flags);
139:
140: return;
141: }
142:
143: void
1.1.1.2 misho 144: isis_circuit_deconfigure (struct isis_circuit *circuit, struct isis_area *area)
1.1 misho 145: {
146: /* Free the index of SRM and SSN flags */
147: flags_free_index (&area->flags, circuit->idx);
1.1.1.2 misho 148: circuit->idx = 0;
149: /* Remove circuit from area */
150: assert (circuit->area == area);
151: listnode_delete (area->circuit_list, circuit);
152: circuit->area = NULL;
1.1 misho 153:
154: return;
155: }
156:
157: struct isis_circuit *
158: circuit_lookup_by_ifp (struct interface *ifp, struct list *list)
159: {
160: struct isis_circuit *circuit = NULL;
161: struct listnode *node;
162:
163: if (!list)
164: return NULL;
165:
166: for (ALL_LIST_ELEMENTS_RO (list, node, circuit))
167: if (circuit->interface == ifp)
1.1.1.2 misho 168: {
169: assert (ifp->info == circuit);
170: return circuit;
171: }
172:
1.1 misho 173: return NULL;
174: }
175:
176: struct isis_circuit *
177: circuit_scan_by_ifp (struct interface *ifp)
178: {
179: struct isis_area *area;
180: struct listnode *node;
181: struct isis_circuit *circuit;
182:
1.1.1.2 misho 183: if (ifp->info)
184: return (struct isis_circuit *)ifp->info;
1.1 misho 185:
1.1.1.2 misho 186: if (isis->area_list)
1.1 misho 187: {
1.1.1.2 misho 188: for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
189: {
190: circuit = circuit_lookup_by_ifp (ifp, area->circuit_list);
191: if (circuit)
192: return circuit;
193: }
1.1 misho 194: }
195: return circuit_lookup_by_ifp (ifp, isis->init_circ_list);
196: }
197:
1.1.1.2 misho 198: static struct isis_circuit *
199: isis_circuit_lookup (struct vty *vty)
1.1 misho 200: {
1.1.1.2 misho 201: struct interface *ifp;
202: struct isis_circuit *circuit;
1.1 misho 203:
1.1.1.2 misho 204: ifp = (struct interface *) vty->index;
205: if (!ifp)
1.1 misho 206: {
1.1.1.2 misho 207: vty_out (vty, "Invalid interface %s", VTY_NEWLINE);
208: return NULL;
1.1 misho 209: }
210:
1.1.1.2 misho 211: circuit = circuit_scan_by_ifp (ifp);
212: if (!circuit)
213: {
214: vty_out (vty, "ISIS is not enabled on circuit %s%s",
215: ifp->name, VTY_NEWLINE);
216: return NULL;
217: }
1.1 misho 218:
1.1.1.2 misho 219: return circuit;
1.1 misho 220: }
221:
222: void
223: isis_circuit_add_addr (struct isis_circuit *circuit,
224: struct connected *connected)
225: {
1.1.1.2 misho 226: struct listnode *node;
1.1 misho 227: struct prefix_ipv4 *ipv4;
228: u_char buf[BUFSIZ];
229: #ifdef HAVE_IPV6
230: struct prefix_ipv6 *ipv6;
231: #endif /* HAVE_IPV6 */
232:
233: memset (&buf, 0, BUFSIZ);
234: if (connected->address->family == AF_INET)
235: {
1.1.1.2 misho 236: u_int32_t addr = connected->address->u.prefix4.s_addr;
237: addr = ntohl (addr);
238: if (IPV4_NET0(addr) ||
239: IPV4_NET127(addr) ||
240: IN_CLASSD(addr) ||
241: IPV4_LINKLOCAL(addr))
242: return;
243:
244: for (ALL_LIST_ELEMENTS_RO (circuit->ip_addrs, node, ipv4))
245: if (prefix_same ((struct prefix *) ipv4, connected->address))
246: return;
247:
1.1 misho 248: ipv4 = prefix_ipv4_new ();
249: ipv4->prefixlen = connected->address->prefixlen;
250: ipv4->prefix = connected->address->u.prefix4;
251: listnode_add (circuit->ip_addrs, ipv4);
252: if (circuit->area)
1.1.1.2 misho 253: lsp_regenerate_schedule (circuit->area, circuit->is_type, 0);
1.1 misho 254:
255: #ifdef EXTREME_DEBUG
256: prefix2str (connected->address, buf, BUFSIZ);
257: zlog_debug ("Added IP address %s to circuit %d", buf,
258: circuit->circuit_id);
259: #endif /* EXTREME_DEBUG */
260: }
261: #ifdef HAVE_IPV6
262: if (connected->address->family == AF_INET6)
263: {
1.1.1.2 misho 264: if (IN6_IS_ADDR_LOOPBACK(&connected->address->u.prefix6))
265: return;
266:
267: for (ALL_LIST_ELEMENTS_RO (circuit->ipv6_link, node, ipv6))
268: if (prefix_same ((struct prefix *) ipv6, connected->address))
269: return;
270: for (ALL_LIST_ELEMENTS_RO (circuit->ipv6_non_link, node, ipv6))
271: if (prefix_same ((struct prefix *) ipv6, connected->address))
272: return;
273:
1.1 misho 274: ipv6 = prefix_ipv6_new ();
275: ipv6->prefixlen = connected->address->prefixlen;
276: ipv6->prefix = connected->address->u.prefix6;
277:
278: if (IN6_IS_ADDR_LINKLOCAL (&ipv6->prefix))
279: listnode_add (circuit->ipv6_link, ipv6);
280: else
281: listnode_add (circuit->ipv6_non_link, ipv6);
282: if (circuit->area)
1.1.1.2 misho 283: lsp_regenerate_schedule (circuit->area, circuit->is_type, 0);
1.1 misho 284:
285: #ifdef EXTREME_DEBUG
286: prefix2str (connected->address, buf, BUFSIZ);
287: zlog_debug ("Added IPv6 address %s to circuit %d", buf,
288: circuit->circuit_id);
289: #endif /* EXTREME_DEBUG */
290: }
291: #endif /* HAVE_IPV6 */
292: return;
293: }
294:
295: void
296: isis_circuit_del_addr (struct isis_circuit *circuit,
297: struct connected *connected)
298: {
299: struct prefix_ipv4 *ipv4, *ip = NULL;
300: struct listnode *node;
301: u_char buf[BUFSIZ];
302: #ifdef HAVE_IPV6
303: struct prefix_ipv6 *ipv6, *ip6 = NULL;
304: int found = 0;
305: #endif /* HAVE_IPV6 */
306:
307: memset (&buf, 0, BUFSIZ);
308: if (connected->address->family == AF_INET)
309: {
310: ipv4 = prefix_ipv4_new ();
311: ipv4->prefixlen = connected->address->prefixlen;
312: ipv4->prefix = connected->address->u.prefix4;
313:
314: for (ALL_LIST_ELEMENTS_RO (circuit->ip_addrs, node, ip))
1.1.1.2 misho 315: if (prefix_same ((struct prefix *) ip, (struct prefix *) ipv4))
1.1 misho 316: break;
317:
318: if (ip)
319: {
320: listnode_delete (circuit->ip_addrs, ip);
1.1.1.2 misho 321: if (circuit->area)
322: lsp_regenerate_schedule (circuit->area, circuit->is_type, 0);
1.1 misho 323: }
324: else
325: {
326: prefix2str (connected->address, (char *)buf, BUFSIZ);
1.1.1.2 misho 327: zlog_warn ("Nonexitant ip address %s removal attempt from \
328: circuit %d", buf, circuit->circuit_id);
1.1 misho 329: }
1.1.1.3 ! misho 330:
! 331: prefix_ipv4_free (ipv4);
1.1 misho 332: }
333: #ifdef HAVE_IPV6
334: if (connected->address->family == AF_INET6)
335: {
336: ipv6 = prefix_ipv6_new ();
337: ipv6->prefixlen = connected->address->prefixlen;
338: ipv6->prefix = connected->address->u.prefix6;
339:
340: if (IN6_IS_ADDR_LINKLOCAL (&ipv6->prefix))
341: {
342: for (ALL_LIST_ELEMENTS_RO (circuit->ipv6_link, node, ip6))
343: {
344: if (prefix_same ((struct prefix *) ip6, (struct prefix *) ipv6))
345: break;
346: }
347: if (ip6)
348: {
349: listnode_delete (circuit->ipv6_link, ip6);
350: found = 1;
351: }
352: }
353: else
354: {
355: for (ALL_LIST_ELEMENTS_RO (circuit->ipv6_non_link, node, ip6))
356: {
357: if (prefix_same ((struct prefix *) ip6, (struct prefix *) ipv6))
358: break;
359: }
360: if (ip6)
361: {
362: listnode_delete (circuit->ipv6_non_link, ip6);
363: found = 1;
364: }
365: }
366:
367: if (!found)
368: {
369: prefix2str (connected->address, (char *)buf, BUFSIZ);
1.1.1.2 misho 370: zlog_warn ("Nonexitant ip address %s removal attempt from \
371: circuit %d", buf, circuit->circuit_id);
1.1 misho 372: }
1.1.1.2 misho 373: else if (circuit->area)
374: lsp_regenerate_schedule (circuit->area, circuit->is_type, 0);
1.1.1.3 ! misho 375:
! 376: prefix_ipv6_free (ipv6);
1.1 misho 377: }
378: #endif /* HAVE_IPV6 */
379: return;
380: }
381:
1.1.1.2 misho 382: static u_char
383: isis_circuit_id_gen (struct interface *ifp)
384: {
385: u_char id = 0;
386: char ifname[16];
387: unsigned int i;
388: int start = -1, end = -1;
389:
390: /*
391: * Get a stable circuit id from ifname. This makes
392: * the ifindex from flapping when netdevs are created
393: * and deleted on the fly. Note that this circuit id
394: * is used in pseudo lsps so it is better to be stable.
395: * The following code works on any reasonanle ifname
396: * like: eth1 or trk-1.1 etc.
397: */
398: for (i = 0; i < strlen (ifp->name); i++)
399: {
400: if (isdigit(ifp->name[i]))
401: {
402: if (start < 0)
403: {
404: start = i;
405: end = i + 1;
406: }
407: else
408: {
409: end = i + 1;
410: }
411: }
412: else if (start >= 0)
413: break;
414: }
415:
416: if ((start >= 0) && (end >= start) && (end - start) < 16)
417: {
418: memset (ifname, 0, 16);
419: strncpy (ifname, &ifp->name[start], end - start);
420: id = (u_char)atoi(ifname);
421: }
422:
423: /* Try to be unique. */
424: if (!id)
425: id = (u_char)((ifp->ifindex & 0xff) | 0x80);
426:
427: return id;
428: }
429:
1.1 misho 430: void
431: isis_circuit_if_add (struct isis_circuit *circuit, struct interface *ifp)
432: {
433: struct listnode *node, *nnode;
434: struct connected *conn;
435:
1.1.1.2 misho 436: circuit->circuit_id = isis_circuit_id_gen (ifp);
1.1 misho 437:
1.1.1.2 misho 438: isis_circuit_if_bind (circuit, ifp);
1.1 misho 439: /* isis_circuit_update_addrs (circuit, ifp); */
440:
441: if (if_is_broadcast (ifp))
442: {
1.1.1.2 misho 443: if (circuit->circ_type_config == CIRCUIT_T_P2P)
444: circuit->circ_type = CIRCUIT_T_P2P;
1.1 misho 445: else
1.1.1.2 misho 446: circuit->circ_type = CIRCUIT_T_BROADCAST;
1.1 misho 447: }
448: else if (if_is_pointopoint (ifp))
449: {
450: circuit->circ_type = CIRCUIT_T_P2P;
451: }
1.1.1.2 misho 452: else if (if_is_loopback (ifp))
453: {
454: circuit->circ_type = CIRCUIT_T_LOOPBACK;
455: circuit->is_passive = 1;
456: }
1.1 misho 457: else
458: {
459: /* It's normal in case of loopback etc. */
460: if (isis->debugs & DEBUG_EVENTS)
1.1.1.2 misho 461: zlog_debug ("isis_circuit_if_add: unsupported media");
462: circuit->circ_type = CIRCUIT_T_UNKNOWN;
1.1 misho 463: }
464:
1.1.1.2 misho 465: circuit->ip_addrs = list_new ();
466: #ifdef HAVE_IPV6
467: circuit->ipv6_link = list_new ();
468: circuit->ipv6_non_link = list_new ();
469: #endif /* HAVE_IPV6 */
470:
1.1 misho 471: for (ALL_LIST_ELEMENTS (ifp->connected, node, nnode, conn))
472: isis_circuit_add_addr (circuit, conn);
473:
474: return;
475: }
476:
477: void
1.1.1.2 misho 478: isis_circuit_if_del (struct isis_circuit *circuit, struct interface *ifp)
1.1 misho 479: {
1.1.1.2 misho 480: struct listnode *node, *nnode;
481: struct connected *conn;
1.1 misho 482:
1.1.1.2 misho 483: assert (circuit->interface == ifp);
1.1 misho 484:
1.1.1.2 misho 485: /* destroy addresses */
486: for (ALL_LIST_ELEMENTS (ifp->connected, node, nnode, conn))
487: isis_circuit_del_addr (circuit, conn);
488:
489: if (circuit->ip_addrs)
1.1 misho 490: {
1.1.1.2 misho 491: assert (listcount(circuit->ip_addrs) == 0);
492: list_delete (circuit->ip_addrs);
493: circuit->ip_addrs = NULL;
1.1 misho 494: }
1.1.1.2 misho 495:
496: #ifdef HAVE_IPV6
497: if (circuit->ipv6_link)
1.1 misho 498: {
1.1.1.2 misho 499: assert (listcount(circuit->ipv6_link) == 0);
500: list_delete (circuit->ipv6_link);
501: circuit->ipv6_link = NULL;
1.1 misho 502: }
1.1.1.2 misho 503:
504: if (circuit->ipv6_non_link)
1.1 misho 505: {
1.1.1.2 misho 506: assert (listcount(circuit->ipv6_non_link) == 0);
507: list_delete (circuit->ipv6_non_link);
508: circuit->ipv6_non_link = NULL;
1.1 misho 509: }
1.1.1.2 misho 510: #endif /* HAVE_IPV6 */
511:
512: circuit->circ_type = CIRCUIT_T_UNKNOWN;
513: circuit->circuit_id = 0;
1.1 misho 514:
515: return;
516: }
517:
518: void
1.1.1.2 misho 519: isis_circuit_if_bind (struct isis_circuit *circuit, struct interface *ifp)
1.1 misho 520: {
1.1.1.2 misho 521: assert (circuit != NULL);
522: assert (ifp != NULL);
523: if (circuit->interface)
524: assert (circuit->interface == ifp);
525: else
526: circuit->interface = ifp;
527: if (ifp->info)
528: assert (ifp->info == circuit);
529: else
530: ifp->info = circuit;
531: }
532:
533: void
534: isis_circuit_if_unbind (struct isis_circuit *circuit, struct interface *ifp)
535: {
536: assert (circuit != NULL);
537: assert (ifp != NULL);
538: assert (circuit->interface == ifp);
539: assert (ifp->info == circuit);
1.1 misho 540: circuit->interface = NULL;
1.1.1.2 misho 541: ifp->info = NULL;
542: }
1.1 misho 543:
1.1.1.2 misho 544: static void
545: isis_circuit_update_all_srmflags (struct isis_circuit *circuit, int is_set)
546: {
547: struct isis_area *area;
548: struct isis_lsp *lsp;
549: dnode_t *dnode, *dnode_next;
550: int level;
551:
552: assert (circuit);
553: area = circuit->area;
554: assert (area);
555: for (level = ISIS_LEVEL1; level <= ISIS_LEVEL2; level++)
556: {
557: if (level & circuit->is_type)
558: {
559: if (area->lspdb[level - 1] &&
560: dict_count (area->lspdb[level - 1]) > 0)
561: {
562: for (dnode = dict_first (area->lspdb[level - 1]);
563: dnode != NULL; dnode = dnode_next)
564: {
565: dnode_next = dict_next (area->lspdb[level - 1], dnode);
566: lsp = dnode_get (dnode);
567: if (is_set)
568: {
569: ISIS_SET_FLAG (lsp->SRMflags, circuit);
570: }
571: else
572: {
573: ISIS_CLEAR_FLAG (lsp->SRMflags, circuit);
574: }
575: }
576: }
577: }
578: }
1.1 misho 579: }
580:
1.1.1.2 misho 581: int
1.1 misho 582: isis_circuit_up (struct isis_circuit *circuit)
583: {
1.1.1.2 misho 584: int retv;
585:
586: /* Set the flags for all the lsps of the circuit. */
587: isis_circuit_update_all_srmflags (circuit, 1);
588:
589: if (circuit->state == C_STATE_UP)
590: return ISIS_OK;
591:
592: if (circuit->is_passive)
593: return ISIS_OK;
1.1 misho 594:
595: if (circuit->circ_type == CIRCUIT_T_BROADCAST)
596: {
1.1.1.2 misho 597: /*
598: * Get the Hardware Address
599: */
600: #ifdef HAVE_STRUCT_SOCKADDR_DL
601: #ifndef SUNOS_5
602: if (circuit->interface->sdl.sdl_alen != ETHER_ADDR_LEN)
603: zlog_warn ("unsupported link layer");
604: else
605: memcpy (circuit->u.bc.snpa, LLADDR (&circuit->interface->sdl),
606: ETH_ALEN);
607: #endif
608: #else
609: if (circuit->interface->hw_addr_len != ETH_ALEN)
610: {
611: zlog_warn ("unsupported link layer");
612: }
613: else
614: {
615: memcpy (circuit->u.bc.snpa, circuit->interface->hw_addr, ETH_ALEN);
616: }
617: #ifdef EXTREME_DEGUG
618: zlog_debug ("isis_circuit_if_add: if_id %d, isomtu %d snpa %s",
619: circuit->interface->ifindex, ISO_MTU (circuit),
620: snpa_print (circuit->u.bc.snpa));
621: #endif /* EXTREME_DEBUG */
622: #endif /* HAVE_STRUCT_SOCKADDR_DL */
623:
624: circuit->u.bc.adjdb[0] = list_new ();
625: circuit->u.bc.adjdb[1] = list_new ();
626:
1.1 misho 627: if (circuit->area->min_bcast_mtu == 0 ||
1.1.1.2 misho 628: ISO_MTU (circuit) < circuit->area->min_bcast_mtu)
629: circuit->area->min_bcast_mtu = ISO_MTU (circuit);
1.1 misho 630: /*
631: * ISO 10589 - 8.4.1 Enabling of broadcast circuits
632: */
633:
634: /* initilizing the hello sending threads
635: * for a broadcast IF
636: */
637:
638: /* 8.4.1 a) commence sending of IIH PDUs */
639:
1.1.1.2 misho 640: if (circuit->is_type & IS_LEVEL_1)
641: {
642: thread_add_event (master, send_lan_l1_hello, circuit, 0);
643: circuit->u.bc.lan_neighs[0] = list_new ();
644: }
645:
646: if (circuit->is_type & IS_LEVEL_2)
647: {
648: thread_add_event (master, send_lan_l2_hello, circuit, 0);
649: circuit->u.bc.lan_neighs[1] = list_new ();
650: }
1.1 misho 651:
652: /* 8.4.1 b) FIXME: solicit ES - 8.4.6 */
653: /* 8.4.1 c) FIXME: listen for ESH PDUs */
654:
655: /* 8.4.1 d) */
656: /* dr election will commence in... */
1.1.1.2 misho 657: if (circuit->is_type & IS_LEVEL_1)
658: THREAD_TIMER_ON (master, circuit->u.bc.t_run_dr[0], isis_run_dr_l1,
659: circuit, 2 * circuit->hello_interval[0]);
660: if (circuit->is_type & IS_LEVEL_2)
661: THREAD_TIMER_ON (master, circuit->u.bc.t_run_dr[1], isis_run_dr_l2,
662: circuit, 2 * circuit->hello_interval[1]);
1.1 misho 663: }
664: else
665: {
666: /* initializing the hello send threads
667: * for a ptp IF
668: */
1.1.1.2 misho 669: circuit->u.p2p.neighbor = NULL;
1.1 misho 670: thread_add_event (master, send_p2p_hello, circuit, 0);
671: }
672:
673: /* initializing PSNP timers */
1.1.1.2 misho 674: if (circuit->is_type & IS_LEVEL_1)
675: THREAD_TIMER_ON (master, circuit->t_send_psnp[0], send_l1_psnp, circuit,
676: isis_jitter (circuit->psnp_interval[0], PSNP_JITTER));
1.1 misho 677:
1.1.1.2 misho 678: if (circuit->is_type & IS_LEVEL_2)
679: THREAD_TIMER_ON (master, circuit->t_send_psnp[1], send_l2_psnp, circuit,
680: isis_jitter (circuit->psnp_interval[1], PSNP_JITTER));
681:
682: /* unified init for circuits; ignore warnings below this level */
683: retv = isis_sock_init (circuit);
684: if (retv != ISIS_OK)
1.1 misho 685: {
1.1.1.2 misho 686: isis_circuit_down (circuit);
687: return retv;
1.1 misho 688: }
689:
1.1.1.2 misho 690: /* initialize the circuit streams after opening connection */
1.1 misho 691: if (circuit->rcv_stream == NULL)
692: circuit->rcv_stream = stream_new (ISO_MTU (circuit));
693:
694: if (circuit->snd_stream == NULL)
695: circuit->snd_stream = stream_new (ISO_MTU (circuit));
696:
697: #ifdef GNU_LINUX
698: THREAD_READ_ON (master, circuit->t_read, isis_receive, circuit,
1.1.1.2 misho 699: circuit->fd);
1.1 misho 700: #else
701: THREAD_TIMER_ON (master, circuit->t_read, isis_receive, circuit,
1.1.1.2 misho 702: circuit->fd);
1.1 misho 703: #endif
1.1.1.2 misho 704:
705: circuit->lsp_queue = list_new ();
706: circuit->lsp_queue_last_cleared = time (NULL);
707:
708: return ISIS_OK;
1.1 misho 709: }
710:
711: void
712: isis_circuit_down (struct isis_circuit *circuit)
713: {
1.1.1.2 misho 714: if (circuit->state != C_STATE_UP)
715: return;
716:
717: /* Clear the flags for all the lsps of the circuit. */
718: isis_circuit_update_all_srmflags (circuit, 0);
719:
1.1 misho 720: if (circuit->circ_type == CIRCUIT_T_BROADCAST)
721: {
1.1.1.2 misho 722: /* destroy neighbour lists */
723: if (circuit->u.bc.lan_neighs[0])
724: {
725: list_delete (circuit->u.bc.lan_neighs[0]);
726: circuit->u.bc.lan_neighs[0] = NULL;
727: }
728: if (circuit->u.bc.lan_neighs[1])
729: {
730: list_delete (circuit->u.bc.lan_neighs[1]);
731: circuit->u.bc.lan_neighs[1] = NULL;
732: }
733: /* destroy adjacency databases */
734: if (circuit->u.bc.adjdb[0])
735: {
736: circuit->u.bc.adjdb[0]->del = isis_delete_adj;
737: list_delete (circuit->u.bc.adjdb[0]);
738: circuit->u.bc.adjdb[0] = NULL;
739: }
740: if (circuit->u.bc.adjdb[1])
741: {
742: circuit->u.bc.adjdb[1]->del = isis_delete_adj;
743: list_delete (circuit->u.bc.adjdb[1]);
744: circuit->u.bc.adjdb[1] = NULL;
745: }
746: if (circuit->u.bc.is_dr[0])
747: {
748: isis_dr_resign (circuit, 1);
749: circuit->u.bc.is_dr[0] = 0;
750: }
751: memset (circuit->u.bc.l1_desig_is, 0, ISIS_SYS_ID_LEN + 1);
752: if (circuit->u.bc.is_dr[1])
753: {
754: isis_dr_resign (circuit, 2);
755: circuit->u.bc.is_dr[1] = 0;
756: }
757: memset (circuit->u.bc.l2_desig_is, 0, ISIS_SYS_ID_LEN + 1);
758: memset (circuit->u.bc.snpa, 0, ETH_ALEN);
759:
1.1 misho 760: THREAD_TIMER_OFF (circuit->u.bc.t_send_lan_hello[0]);
761: THREAD_TIMER_OFF (circuit->u.bc.t_send_lan_hello[1]);
762: THREAD_TIMER_OFF (circuit->u.bc.t_run_dr[0]);
763: THREAD_TIMER_OFF (circuit->u.bc.t_run_dr[1]);
1.1.1.2 misho 764: THREAD_TIMER_OFF (circuit->u.bc.t_refresh_pseudo_lsp[0]);
765: THREAD_TIMER_OFF (circuit->u.bc.t_refresh_pseudo_lsp[1]);
1.1 misho 766: }
767: else if (circuit->circ_type == CIRCUIT_T_P2P)
768: {
1.1.1.2 misho 769: isis_delete_adj (circuit->u.p2p.neighbor);
770: circuit->u.p2p.neighbor = NULL;
1.1 misho 771: THREAD_TIMER_OFF (circuit->u.p2p.t_send_p2p_hello);
772: }
773:
1.1.1.2 misho 774: /* Cancel all active threads */
775: THREAD_TIMER_OFF (circuit->t_send_csnp[0]);
776: THREAD_TIMER_OFF (circuit->t_send_csnp[1]);
777: THREAD_TIMER_OFF (circuit->t_send_psnp[0]);
778: THREAD_TIMER_OFF (circuit->t_send_psnp[1]);
779: THREAD_OFF (circuit->t_read);
780:
781: if (circuit->lsp_queue)
782: {
783: circuit->lsp_queue->del = NULL;
784: list_delete (circuit->lsp_queue);
785: circuit->lsp_queue = NULL;
786: }
787:
788: /* send one gratuitous hello to spead up convergence */
789: if (circuit->is_type & IS_LEVEL_1)
790: send_hello (circuit, IS_LEVEL_1);
791: if (circuit->is_type & IS_LEVEL_2)
792: send_hello (circuit, IS_LEVEL_2);
793:
794: circuit->upadjcount[0] = 0;
795: circuit->upadjcount[1] = 0;
796:
1.1 misho 797: /* close the socket */
1.1.1.2 misho 798: if (circuit->fd)
799: {
800: close (circuit->fd);
801: circuit->fd = 0;
802: }
803:
804: if (circuit->rcv_stream != NULL)
805: {
806: stream_free (circuit->rcv_stream);
807: circuit->rcv_stream = NULL;
808: }
809:
810: if (circuit->snd_stream != NULL)
811: {
812: stream_free (circuit->snd_stream);
813: circuit->snd_stream = NULL;
814: }
815:
816: thread_cancel_event (master, circuit);
1.1 misho 817:
818: return;
819: }
820:
821: void
822: circuit_update_nlpids (struct isis_circuit *circuit)
823: {
824: circuit->nlpids.count = 0;
825:
826: if (circuit->ip_router)
827: {
828: circuit->nlpids.nlpids[0] = NLPID_IP;
829: circuit->nlpids.count++;
830: }
831: #ifdef HAVE_IPV6
832: if (circuit->ipv6_router)
833: {
834: circuit->nlpids.nlpids[circuit->nlpids.count] = NLPID_IPV6;
835: circuit->nlpids.count++;
836: }
837: #endif /* HAVE_IPV6 */
838: return;
839: }
840:
1.1.1.2 misho 841: void
842: isis_circuit_print_vty (struct isis_circuit *circuit, struct vty *vty,
843: char detail)
844: {
845: if (detail == ISIS_UI_LEVEL_BRIEF)
846: {
847: vty_out (vty, " %-12s", circuit->interface->name);
848: vty_out (vty, "0x%-7x", circuit->circuit_id);
849: vty_out (vty, "%-9s", circuit_state2string (circuit->state));
850: vty_out (vty, "%-9s", circuit_type2string (circuit->circ_type));
851: vty_out (vty, "%-9s", circuit_t2string (circuit->is_type));
852: vty_out (vty, "%s", VTY_NEWLINE);
853: }
854:
855: if (detail == ISIS_UI_LEVEL_DETAIL)
856: {
857: vty_out (vty, " Interface: %s", circuit->interface->name);
858: vty_out (vty, ", State: %s", circuit_state2string (circuit->state));
859: if (circuit->is_passive)
860: vty_out (vty, ", Passive");
861: else
862: vty_out (vty, ", Active");
863: vty_out (vty, ", Circuit Id: 0x%x", circuit->circuit_id);
864: vty_out (vty, "%s", VTY_NEWLINE);
865: vty_out (vty, " Type: %s", circuit_type2string (circuit->circ_type));
866: vty_out (vty, ", Level: %s", circuit_t2string (circuit->is_type));
867: if (circuit->circ_type == CIRCUIT_T_BROADCAST)
868: vty_out (vty, ", SNPA: %-10s", snpa_print (circuit->u.bc.snpa));
869: vty_out (vty, "%s", VTY_NEWLINE);
870: if (circuit->is_type & IS_LEVEL_1)
871: {
872: vty_out (vty, " Level-1 Information:%s", VTY_NEWLINE);
873: if (circuit->area->newmetric)
874: vty_out (vty, " Metric: %d", circuit->te_metric[0]);
875: else
876: vty_out (vty, " Metric: %d",
877: circuit->metrics[0].metric_default);
878: if (!circuit->is_passive)
879: {
880: vty_out (vty, ", Active neighbors: %u%s",
881: circuit->upadjcount[0], VTY_NEWLINE);
882: vty_out (vty, " Hello interval: %u, "
883: "Holddown count: %u %s%s",
884: circuit->hello_interval[0],
885: circuit->hello_multiplier[0],
886: (circuit->pad_hellos ? "(pad)" : "(no-pad)"),
887: VTY_NEWLINE);
888: vty_out (vty, " CNSP interval: %u, "
889: "PSNP interval: %u%s",
890: circuit->csnp_interval[0],
891: circuit->psnp_interval[0], VTY_NEWLINE);
892: if (circuit->circ_type == CIRCUIT_T_BROADCAST)
893: vty_out (vty, " LAN Priority: %u, %s%s",
894: circuit->priority[0],
895: (circuit->u.bc.is_dr[0] ? \
896: "is DIS" : "is not DIS"), VTY_NEWLINE);
897: }
898: else
899: {
900: vty_out (vty, "%s", VTY_NEWLINE);
901: }
902: }
903: if (circuit->is_type & IS_LEVEL_2)
904: {
905: vty_out (vty, " Level-2 Information:%s", VTY_NEWLINE);
906: if (circuit->area->newmetric)
907: vty_out (vty, " Metric: %d", circuit->te_metric[1]);
908: else
909: vty_out (vty, " Metric: %d",
910: circuit->metrics[1].metric_default);
911: if (!circuit->is_passive)
912: {
913: vty_out (vty, ", Active neighbors: %u%s",
914: circuit->upadjcount[1], VTY_NEWLINE);
915: vty_out (vty, " Hello interval: %u, "
916: "Holddown count: %u %s%s",
917: circuit->hello_interval[1],
918: circuit->hello_multiplier[1],
919: (circuit->pad_hellos ? "(pad)" : "(no-pad)"),
920: VTY_NEWLINE);
921: vty_out (vty, " CNSP interval: %u, "
922: "PSNP interval: %u%s",
923: circuit->csnp_interval[1],
924: circuit->psnp_interval[1], VTY_NEWLINE);
925: if (circuit->circ_type == CIRCUIT_T_BROADCAST)
926: vty_out (vty, " LAN Priority: %u, %s%s",
927: circuit->priority[1],
928: (circuit->u.bc.is_dr[1] ? \
929: "is DIS" : "is not DIS"), VTY_NEWLINE);
930: }
931: else
932: {
933: vty_out (vty, "%s", VTY_NEWLINE);
934: }
935: }
936: if (circuit->ip_addrs && listcount (circuit->ip_addrs) > 0)
937: {
938: struct listnode *node;
939: struct prefix *ip_addr;
940: u_char buf[BUFSIZ];
941: vty_out (vty, " IP Prefix(es):%s", VTY_NEWLINE);
942: for (ALL_LIST_ELEMENTS_RO (circuit->ip_addrs, node, ip_addr))
943: {
944: prefix2str (ip_addr, (char*)buf, BUFSIZ),
945: vty_out (vty, " %s%s", buf, VTY_NEWLINE);
946: }
947: }
948: vty_out (vty, "%s", VTY_NEWLINE);
949: }
950: return;
951: }
952:
1.1 misho 953: int
954: isis_interface_config_write (struct vty *vty)
955: {
956: int write = 0;
957: struct listnode *node, *node2;
958: struct interface *ifp;
959: struct isis_area *area;
1.1.1.2 misho 960: struct isis_circuit *circuit;
1.1 misho 961: int i;
962:
963: for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
964: {
1.1.1.2 misho 965: /* IF name */
966: vty_out (vty, "interface %s%s", ifp->name, VTY_NEWLINE);
967: write++;
968: /* IF desc */
969: if (ifp->desc)
970: {
971: vty_out (vty, " description %s%s", ifp->desc, VTY_NEWLINE);
972: write++;
973: }
974: /* ISIS Circuit */
975: for (ALL_LIST_ELEMENTS_RO (isis->area_list, node2, area))
976: {
977: circuit = circuit_lookup_by_ifp (ifp, area->circuit_list);
978: if (circuit == NULL)
979: continue;
980: if (circuit->ip_router)
981: {
982: vty_out (vty, " ip router isis %s%s", area->area_tag,
983: VTY_NEWLINE);
984: write++;
985: }
986: if (circuit->is_passive)
987: {
988: vty_out (vty, " isis passive%s", VTY_NEWLINE);
989: write++;
990: }
991: if (circuit->circ_type_config == CIRCUIT_T_P2P)
992: {
993: vty_out (vty, " isis network point-to-point%s", VTY_NEWLINE);
994: write++;
995: }
1.1 misho 996: #ifdef HAVE_IPV6
1.1.1.2 misho 997: if (circuit->ipv6_router)
998: {
999: vty_out (vty, " ipv6 router isis %s%s", area->area_tag,
1000: VTY_NEWLINE);
1001: write++;
1002: }
1.1 misho 1003: #endif /* HAVE_IPV6 */
1004:
1.1.1.2 misho 1005: /* ISIS - circuit type */
1006: if (circuit->is_type == IS_LEVEL_1)
1007: {
1008: vty_out (vty, " isis circuit-type level-1%s", VTY_NEWLINE);
1009: write++;
1010: }
1011: else
1012: {
1013: if (circuit->is_type == IS_LEVEL_2)
1014: {
1015: vty_out (vty, " isis circuit-type level-2-only%s",
1016: VTY_NEWLINE);
1017: write++;
1018: }
1019: }
1020:
1021: /* ISIS - CSNP interval */
1022: if (circuit->csnp_interval[0] == circuit->csnp_interval[1])
1023: {
1024: if (circuit->csnp_interval[0] != DEFAULT_CSNP_INTERVAL)
1025: {
1026: vty_out (vty, " isis csnp-interval %d%s",
1027: circuit->csnp_interval[0], VTY_NEWLINE);
1028: write++;
1029: }
1030: }
1031: else
1032: {
1033: for (i = 0; i < 2; i++)
1034: {
1035: if (circuit->csnp_interval[i] != DEFAULT_CSNP_INTERVAL)
1036: {
1037: vty_out (vty, " isis csnp-interval %d level-%d%s",
1038: circuit->csnp_interval[i], i + 1, VTY_NEWLINE);
1039: write++;
1040: }
1041: }
1042: }
1043:
1044: /* ISIS - PSNP interval */
1045: if (circuit->psnp_interval[0] == circuit->psnp_interval[1])
1046: {
1047: if (circuit->psnp_interval[0] != DEFAULT_PSNP_INTERVAL)
1048: {
1049: vty_out (vty, " isis psnp-interval %d%s",
1050: circuit->psnp_interval[0], VTY_NEWLINE);
1051: write++;
1052: }
1053: }
1054: else
1055: {
1056: for (i = 0; i < 2; i++)
1057: {
1058: if (circuit->psnp_interval[i] != DEFAULT_PSNP_INTERVAL)
1059: {
1060: vty_out (vty, " isis psnp-interval %d level-%d%s",
1061: circuit->psnp_interval[i], i + 1, VTY_NEWLINE);
1062: write++;
1063: }
1064: }
1065: }
1066:
1067: /* ISIS - Hello padding - Defaults to true so only display if false */
1068: if (circuit->pad_hellos == 0)
1069: {
1070: vty_out (vty, " no isis hello padding%s", VTY_NEWLINE);
1071: write++;
1072: }
1073:
1074: /* ISIS - Hello interval */
1075: if (circuit->hello_interval[0] == circuit->hello_interval[1])
1076: {
1077: if (circuit->hello_interval[0] != DEFAULT_HELLO_INTERVAL)
1078: {
1079: vty_out (vty, " isis hello-interval %d%s",
1080: circuit->hello_interval[0], VTY_NEWLINE);
1081: write++;
1082: }
1083: }
1084: else
1085: {
1086: for (i = 0; i < 2; i++)
1087: {
1088: if (circuit->hello_interval[i] != DEFAULT_HELLO_INTERVAL)
1089: {
1090: vty_out (vty, " isis hello-interval %d level-%d%s",
1091: circuit->hello_interval[i], i + 1, VTY_NEWLINE);
1092: write++;
1093: }
1094: }
1095: }
1096:
1097: /* ISIS - Hello Multiplier */
1098: if (circuit->hello_multiplier[0] == circuit->hello_multiplier[1])
1099: {
1100: if (circuit->hello_multiplier[0] != DEFAULT_HELLO_MULTIPLIER)
1101: {
1102: vty_out (vty, " isis hello-multiplier %d%s",
1103: circuit->hello_multiplier[0], VTY_NEWLINE);
1104: write++;
1105: }
1106: }
1107: else
1108: {
1109: for (i = 0; i < 2; i++)
1110: {
1111: if (circuit->hello_multiplier[i] != DEFAULT_HELLO_MULTIPLIER)
1112: {
1113: vty_out (vty, " isis hello-multiplier %d level-%d%s",
1114: circuit->hello_multiplier[i], i + 1,
1115: VTY_NEWLINE);
1116: write++;
1117: }
1118: }
1119: }
1120:
1121: /* ISIS - Priority */
1122: if (circuit->priority[0] == circuit->priority[1])
1123: {
1124: if (circuit->priority[0] != DEFAULT_PRIORITY)
1125: {
1126: vty_out (vty, " isis priority %d%s",
1127: circuit->priority[0], VTY_NEWLINE);
1128: write++;
1129: }
1130: }
1131: else
1132: {
1133: for (i = 0; i < 2; i++)
1134: {
1135: if (circuit->priority[i] != DEFAULT_PRIORITY)
1136: {
1137: vty_out (vty, " isis priority %d level-%d%s",
1138: circuit->priority[i], i + 1, VTY_NEWLINE);
1139: write++;
1140: }
1141: }
1142: }
1143:
1144: /* ISIS - Metric */
1145: if (circuit->te_metric[0] == circuit->te_metric[1])
1146: {
1147: if (circuit->te_metric[0] != DEFAULT_CIRCUIT_METRIC)
1148: {
1149: vty_out (vty, " isis metric %d%s", circuit->te_metric[0],
1150: VTY_NEWLINE);
1151: write++;
1152: }
1153: }
1154: else
1155: {
1156: for (i = 0; i < 2; i++)
1157: {
1158: if (circuit->te_metric[i] != DEFAULT_CIRCUIT_METRIC)
1159: {
1160: vty_out (vty, " isis metric %d level-%d%s",
1161: circuit->te_metric[i], i + 1, VTY_NEWLINE);
1162: write++;
1163: }
1164: }
1165: }
1166: if (circuit->passwd.type == ISIS_PASSWD_TYPE_HMAC_MD5)
1167: {
1168: vty_out (vty, " isis password md5 %s%s", circuit->passwd.passwd,
1169: VTY_NEWLINE);
1170: write++;
1171: }
1172: else if (circuit->passwd.type == ISIS_PASSWD_TYPE_CLEARTXT)
1173: {
1174: vty_out (vty, " isis password clear %s%s", circuit->passwd.passwd,
1175: VTY_NEWLINE);
1176: write++;
1177: }
1178: }
1179: vty_out (vty, "!%s", VTY_NEWLINE);
1.1 misho 1180: }
1181:
1182: return write;
1183: }
1184:
1185: DEFUN (ip_router_isis,
1186: ip_router_isis_cmd,
1187: "ip router isis WORD",
1188: "Interface Internet Protocol config commands\n"
1189: "IP router interface commands\n"
1190: "IS-IS Routing for IP\n"
1191: "Routing process tag\n")
1192: {
1.1.1.2 misho 1193: struct isis_circuit *circuit;
1.1 misho 1194: struct interface *ifp;
1195: struct isis_area *area;
1196:
1197: ifp = (struct interface *) vty->index;
1198: assert (ifp);
1199:
1.1.1.2 misho 1200: /* Prevent more than one area per circuit */
1201: circuit = circuit_scan_by_ifp (ifp);
1202: if (circuit)
1.1 misho 1203: {
1.1.1.2 misho 1204: if (circuit->ip_router == 1)
1205: {
1206: if (strcmp (circuit->area->area_tag, argv[0]))
1207: {
1208: vty_out (vty, "ISIS circuit is already defined on %s%s",
1209: circuit->area->area_tag, VTY_NEWLINE);
1210: return CMD_ERR_NOTHING_TODO;
1211: }
1212: return CMD_SUCCESS;
1213: }
1.1 misho 1214: }
1215:
1.1.1.2 misho 1216: if (isis_area_get (vty, argv[0]) != CMD_SUCCESS)
1.1 misho 1217: {
1.1.1.2 misho 1218: vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE);
1219: return CMD_ERR_NO_MATCH;
1.1 misho 1220: }
1.1.1.2 misho 1221: area = vty->index;
1.1 misho 1222:
1.1.1.2 misho 1223: circuit = isis_csm_state_change (ISIS_ENABLE, circuit, area);
1224: isis_circuit_if_bind (circuit, ifp);
1.1 misho 1225:
1.1.1.2 misho 1226: circuit->ip_router = 1;
1.1 misho 1227: area->ip_circuits++;
1.1.1.2 misho 1228: circuit_update_nlpids (circuit);
1.1 misho 1229:
1230: vty->node = INTERFACE_NODE;
1.1.1.2 misho 1231: vty->index = ifp;
1.1 misho 1232:
1233: return CMD_SUCCESS;
1234: }
1235:
1236: DEFUN (no_ip_router_isis,
1237: no_ip_router_isis_cmd,
1238: "no ip router isis WORD",
1239: NO_STR
1240: "Interface Internet Protocol config commands\n"
1241: "IP router interface commands\n"
1242: "IS-IS Routing for IP\n"
1243: "Routing process tag\n")
1244: {
1245: struct interface *ifp;
1246: struct isis_area *area;
1.1.1.2 misho 1247: struct isis_circuit *circuit;
1.1 misho 1248:
1249: ifp = (struct interface *) vty->index;
1.1.1.2 misho 1250: if (!ifp)
1251: {
1252: vty_out (vty, "Invalid interface %s", VTY_NEWLINE);
1253: return CMD_ERR_NO_MATCH;
1254: }
1.1 misho 1255:
1256: area = isis_area_lookup (argv[0]);
1257: if (!area)
1258: {
1.1.1.2 misho 1259: vty_out (vty, "Can't find ISIS instance %s%s",
1260: argv[0], VTY_NEWLINE);
1261: return CMD_ERR_NO_MATCH;
1.1 misho 1262: }
1.1.1.2 misho 1263:
1264: circuit = circuit_lookup_by_ifp (ifp, area->circuit_list);
1.1 misho 1265: if (!circuit)
1266: {
1.1.1.2 misho 1267: vty_out (vty, "ISIS is not enabled on circuit %s%s",
1268: ifp->name, VTY_NEWLINE);
1269: return CMD_ERR_NO_MATCH;
1.1 misho 1270: }
1.1.1.2 misho 1271:
1.1 misho 1272: circuit->ip_router = 0;
1273: area->ip_circuits--;
1274: #ifdef HAVE_IPV6
1275: if (circuit->ipv6_router == 0)
1276: #endif
1277: isis_csm_state_change (ISIS_DISABLE, circuit, area);
1278:
1279: return CMD_SUCCESS;
1280: }
1281:
1.1.1.2 misho 1282: #ifdef HAVE_IPV6
1283: DEFUN (ipv6_router_isis,
1284: ipv6_router_isis_cmd,
1285: "ipv6 router isis WORD",
1286: "IPv6 interface subcommands\n"
1287: "IPv6 Router interface commands\n"
1288: "IS-IS Routing for IPv6\n"
1289: "Routing process tag\n")
1.1 misho 1290: {
1291: struct isis_circuit *circuit;
1292: struct interface *ifp;
1.1.1.2 misho 1293: struct isis_area *area;
1.1 misho 1294:
1.1.1.2 misho 1295: ifp = (struct interface *) vty->index;
1296: assert (ifp);
1297:
1298: /* Prevent more than one area per circuit */
1299: circuit = circuit_scan_by_ifp (ifp);
1300: if (circuit)
1.1 misho 1301: {
1.1.1.2 misho 1302: if (circuit->ipv6_router == 1)
1303: {
1304: if (strcmp (circuit->area->area_tag, argv[0]))
1305: {
1306: vty_out (vty, "ISIS circuit is already defined for IPv6 on %s%s",
1307: circuit->area->area_tag, VTY_NEWLINE);
1308: return CMD_ERR_NOTHING_TODO;
1309: }
1310: return CMD_SUCCESS;
1311: }
1.1 misho 1312: }
1313:
1.1.1.2 misho 1314: if (isis_area_get (vty, argv[0]) != CMD_SUCCESS)
1315: {
1316: vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE);
1317: return CMD_ERR_NO_MATCH;
1318: }
1319: area = vty->index;
1.1 misho 1320:
1.1.1.2 misho 1321: circuit = isis_csm_state_change (ISIS_ENABLE, circuit, area);
1322: isis_circuit_if_bind (circuit, ifp);
1323:
1324: circuit->ipv6_router = 1;
1325: area->ipv6_circuits++;
1326: circuit_update_nlpids (circuit);
1327:
1328: vty->node = INTERFACE_NODE;
1329: vty->index = ifp;
1330:
1331: return CMD_SUCCESS;
1332: }
1333:
1334: DEFUN (no_ipv6_router_isis,
1335: no_ipv6_router_isis_cmd,
1336: "no ipv6 router isis WORD",
1337: NO_STR
1338: "IPv6 interface subcommands\n"
1339: "IPv6 Router interface commands\n"
1340: "IS-IS Routing for IPv6\n"
1341: "Routing process tag\n")
1342: {
1343: struct interface *ifp;
1344: struct isis_area *area;
1345: struct listnode *node;
1346: struct isis_circuit *circuit;
1.1 misho 1347:
1.1.1.2 misho 1348: ifp = (struct interface *) vty->index;
1349: if (!ifp)
1350: {
1351: vty_out (vty, "Invalid interface %s", VTY_NEWLINE);
1352: return CMD_ERR_NO_MATCH;
1353: }
1.1 misho 1354:
1.1.1.2 misho 1355: area = isis_area_lookup (argv[0]);
1356: if (!area)
1.1 misho 1357: {
1.1.1.2 misho 1358: vty_out (vty, "Can't find ISIS instance %s%s",
1359: argv[0], VTY_NEWLINE);
1360: return CMD_ERR_NO_MATCH;
1.1 misho 1361: }
1362:
1.1.1.2 misho 1363: circuit = circuit_lookup_by_ifp (ifp, area->circuit_list);
1364: if (!circuit)
1365: {
1366: vty_out (vty, "ISIS is not enabled on circuit %s%s",
1367: ifp->name, VTY_NEWLINE);
1368: return CMD_ERR_NO_MATCH;
1369: }
1370:
1371: circuit->ipv6_router = 0;
1372: area->ipv6_circuits--;
1373: if (circuit->ip_router == 0)
1374: isis_csm_state_change (ISIS_DISABLE, circuit, area);
1375:
1376: return CMD_SUCCESS;
1377: }
1378: #endif /* HAVE_IPV6 */
1379:
1380: DEFUN (isis_passive,
1381: isis_passive_cmd,
1382: "isis passive",
1383: "IS-IS commands\n"
1384: "Configure the passive mode for interface\n")
1385: {
1386: struct isis_circuit *circuit = isis_circuit_lookup (vty);
1387: if (!circuit)
1388: return CMD_ERR_NO_MATCH;
1389:
1390: if (circuit->is_passive == 1)
1391: return CMD_SUCCESS;
1392:
1393: if (circuit->state != C_STATE_UP)
1394: {
1395: circuit->is_passive = 1;
1396: }
1.1 misho 1397: else
1398: {
1.1.1.2 misho 1399: struct isis_area *area = circuit->area;
1400: isis_csm_state_change (ISIS_DISABLE, circuit, area);
1401: circuit->is_passive = 1;
1402: isis_csm_state_change (ISIS_ENABLE, circuit, area);
1.1 misho 1403: }
1404:
1405: return CMD_SUCCESS;
1406: }
1407:
1.1.1.2 misho 1408: DEFUN (no_isis_passive,
1409: no_isis_passive_cmd,
1410: "no isis passive",
1.1 misho 1411: NO_STR
1412: "IS-IS commands\n"
1.1.1.2 misho 1413: "Configure the passive mode for interface\n")
1414: {
1415: struct interface *ifp;
1416: struct isis_circuit *circuit;
1417:
1418: ifp = (struct interface *) vty->index;
1419: if (!ifp)
1420: {
1421: vty_out (vty, "Invalid interface %s", VTY_NEWLINE);
1422: return CMD_ERR_NO_MATCH;
1423: }
1424:
1425: /* FIXME: what is wrong with circuit = ifp->info ? */
1426: circuit = circuit_scan_by_ifp (ifp);
1427: if (!circuit)
1428: {
1429: vty_out (vty, "ISIS is not enabled on circuit %s%s",
1430: ifp->name, VTY_NEWLINE);
1431: return CMD_ERR_NO_MATCH;
1432: }
1433:
1434: if (if_is_loopback(ifp))
1435: {
1436: vty_out (vty, "Can't set no passive for loopback interface%s",
1437: VTY_NEWLINE);
1438: return CMD_ERR_AMBIGUOUS;
1439: }
1440:
1441: if (circuit->is_passive == 0)
1442: return CMD_SUCCESS;
1443:
1444: if (circuit->state != C_STATE_UP)
1445: {
1446: circuit->is_passive = 0;
1447: }
1448: else
1449: {
1450: struct isis_area *area = circuit->area;
1451: isis_csm_state_change (ISIS_DISABLE, circuit, area);
1452: circuit->is_passive = 0;
1453: isis_csm_state_change (ISIS_ENABLE, circuit, area);
1454: }
1455:
1456: return CMD_SUCCESS;
1457: }
1458:
1459: DEFUN (isis_circuit_type,
1460: isis_circuit_type_cmd,
1461: "isis circuit-type (level-1|level-1-2|level-2-only)",
1462: "IS-IS commands\n"
1.1 misho 1463: "Configure circuit type for interface\n"
1464: "Level-1 only adjacencies are formed\n"
1465: "Level-1-2 adjacencies are formed\n"
1466: "Level-2 only adjacencies are formed\n")
1467: {
1.1.1.2 misho 1468: int circuit_type;
1469: struct isis_circuit *circuit = isis_circuit_lookup (vty);
1470: if (!circuit)
1471: return CMD_ERR_NO_MATCH;
1.1 misho 1472:
1.1.1.2 misho 1473: circuit_type = string2circuit_t (argv[0]);
1474: if (!circuit_type)
1.1 misho 1475: {
1.1.1.2 misho 1476: vty_out (vty, "Unknown circuit-type %s", VTY_NEWLINE);
1477: return CMD_ERR_AMBIGUOUS;
1.1 misho 1478: }
1479:
1.1.1.2 misho 1480: if (circuit->state == C_STATE_UP &&
1481: circuit->area->is_type != IS_LEVEL_1_AND_2 &&
1482: circuit->area->is_type != circuit_type)
1483: {
1484: vty_out (vty, "Invalid circuit level for area %s.%s",
1485: circuit->area->area_tag, VTY_NEWLINE);
1486: return CMD_ERR_AMBIGUOUS;
1487: }
1488: isis_event_circuit_type_change (circuit, circuit_type);
1489:
1490: return CMD_SUCCESS;
1491: }
1492:
1493: DEFUN (no_isis_circuit_type,
1494: no_isis_circuit_type_cmd,
1495: "no isis circuit-type (level-1|level-1-2|level-2-only)",
1496: NO_STR
1497: "IS-IS commands\n"
1498: "Configure circuit type for interface\n"
1499: "Level-1 only adjacencies are formed\n"
1500: "Level-1-2 adjacencies are formed\n"
1501: "Level-2 only adjacencies are formed\n")
1502: {
1503: int circuit_type;
1504: struct isis_circuit *circuit = isis_circuit_lookup (vty);
1505: if (!circuit)
1506: return CMD_ERR_NO_MATCH;
1.1 misho 1507:
1508: /*
1.1.1.2 misho 1509: * Set the circuits level to its default value
1.1 misho 1510: */
1.1.1.2 misho 1511: if (circuit->state == C_STATE_UP)
1512: circuit_type = circuit->area->is_type;
1513: else
1514: circuit_type = IS_LEVEL_1_AND_2;
1515: isis_event_circuit_type_change (circuit, circuit_type);
1.1 misho 1516:
1517: return CMD_SUCCESS;
1518: }
1519:
1.1.1.2 misho 1520: DEFUN (isis_passwd_md5,
1521: isis_passwd_md5_cmd,
1522: "isis password md5 WORD",
1.1 misho 1523: "IS-IS commands\n"
1.1.1.2 misho 1524: "Configure the authentication password for a circuit\n"
1525: "Authentication type\n"
1526: "Circuit password\n")
1.1 misho 1527: {
1528: int len;
1.1.1.2 misho 1529: struct isis_circuit *circuit = isis_circuit_lookup (vty);
1530: if (!circuit)
1531: return CMD_ERR_NO_MATCH;
1.1 misho 1532:
1.1.1.2 misho 1533: len = strlen (argv[0]);
1534: if (len > 254)
1.1 misho 1535: {
1.1.1.2 misho 1536: vty_out (vty, "Too long circuit password (>254)%s", VTY_NEWLINE);
1537: return CMD_ERR_AMBIGUOUS;
1.1 misho 1538: }
1.1.1.2 misho 1539: circuit->passwd.len = len;
1540: circuit->passwd.type = ISIS_PASSWD_TYPE_HMAC_MD5;
1541: strncpy ((char *)circuit->passwd.passwd, argv[0], 255);
1542:
1543: return CMD_SUCCESS;
1544: }
1545:
1546: DEFUN (isis_passwd_clear,
1547: isis_passwd_clear_cmd,
1548: "isis password clear WORD",
1549: "IS-IS commands\n"
1550: "Configure the authentication password for a circuit\n"
1551: "Authentication type\n"
1552: "Circuit password\n")
1553: {
1554: int len;
1555: struct isis_circuit *circuit = isis_circuit_lookup (vty);
1556: if (!circuit)
1557: return CMD_ERR_NO_MATCH;
1.1 misho 1558:
1559: len = strlen (argv[0]);
1560: if (len > 254)
1561: {
1562: vty_out (vty, "Too long circuit password (>254)%s", VTY_NEWLINE);
1.1.1.2 misho 1563: return CMD_ERR_AMBIGUOUS;
1.1 misho 1564: }
1565: circuit->passwd.len = len;
1566: circuit->passwd.type = ISIS_PASSWD_TYPE_CLEARTXT;
1567: strncpy ((char *)circuit->passwd.passwd, argv[0], 255);
1568:
1569: return CMD_SUCCESS;
1570: }
1571:
1572: DEFUN (no_isis_passwd,
1573: no_isis_passwd_cmd,
1574: "no isis password",
1575: NO_STR
1576: "IS-IS commands\n"
1.1.1.2 misho 1577: "Configure the authentication password for a circuit\n")
1.1 misho 1578: {
1.1.1.2 misho 1579: struct isis_circuit *circuit = isis_circuit_lookup (vty);
1580: if (!circuit)
1581: return CMD_ERR_NO_MATCH;
1.1 misho 1582:
1583: memset (&circuit->passwd, 0, sizeof (struct isis_passwd));
1584:
1585: return CMD_SUCCESS;
1586: }
1587:
1588: DEFUN (isis_priority,
1589: isis_priority_cmd,
1590: "isis priority <0-127>",
1591: "IS-IS commands\n"
1592: "Set priority for Designated Router election\n"
1593: "Priority value\n")
1594: {
1595: int prio;
1.1.1.2 misho 1596: struct isis_circuit *circuit = isis_circuit_lookup (vty);
1597: if (!circuit)
1598: return CMD_ERR_NO_MATCH;
1.1 misho 1599:
1.1.1.2 misho 1600: prio = atoi (argv[0]);
1601: if (prio < MIN_PRIORITY || prio > MAX_PRIORITY)
1.1 misho 1602: {
1.1.1.2 misho 1603: vty_out (vty, "Invalid priority %d - should be <0-127>%s",
1604: prio, VTY_NEWLINE);
1605: return CMD_ERR_AMBIGUOUS;
1.1 misho 1606: }
1607:
1.1.1.2 misho 1608: circuit->priority[0] = prio;
1609: circuit->priority[1] = prio;
1.1 misho 1610:
1611: return CMD_SUCCESS;
1612: }
1613:
1614: DEFUN (no_isis_priority,
1615: no_isis_priority_cmd,
1616: "no isis priority",
1617: NO_STR
1618: "IS-IS commands\n"
1619: "Set priority for Designated Router election\n")
1620: {
1.1.1.2 misho 1621: struct isis_circuit *circuit = isis_circuit_lookup (vty);
1622: if (!circuit)
1623: return CMD_ERR_NO_MATCH;
1.1 misho 1624:
1.1.1.2 misho 1625: circuit->priority[0] = DEFAULT_PRIORITY;
1626: circuit->priority[1] = DEFAULT_PRIORITY;
1.1 misho 1627:
1628: return CMD_SUCCESS;
1629: }
1630:
1631: ALIAS (no_isis_priority,
1632: no_isis_priority_arg_cmd,
1633: "no isis priority <0-127>",
1634: NO_STR
1635: "IS-IS commands\n"
1636: "Set priority for Designated Router election\n"
1637: "Priority value\n")
1638:
1639: DEFUN (isis_priority_l1,
1640: isis_priority_l1_cmd,
1641: "isis priority <0-127> level-1",
1642: "IS-IS commands\n"
1643: "Set priority for Designated Router election\n"
1644: "Priority value\n"
1645: "Specify priority for level-1 routing\n")
1646: {
1647: int prio;
1.1.1.2 misho 1648: struct isis_circuit *circuit = isis_circuit_lookup (vty);
1649: if (!circuit)
1650: return CMD_ERR_NO_MATCH;
1.1 misho 1651:
1.1.1.2 misho 1652: prio = atoi (argv[0]);
1653: if (prio < MIN_PRIORITY || prio > MAX_PRIORITY)
1.1 misho 1654: {
1.1.1.2 misho 1655: vty_out (vty, "Invalid priority %d - should be <0-127>%s",
1656: prio, VTY_NEWLINE);
1657: return CMD_ERR_AMBIGUOUS;
1.1 misho 1658: }
1659:
1.1.1.2 misho 1660: circuit->priority[0] = prio;
1.1 misho 1661:
1662: return CMD_SUCCESS;
1663: }
1664:
1665: DEFUN (no_isis_priority_l1,
1666: no_isis_priority_l1_cmd,
1667: "no isis priority level-1",
1668: NO_STR
1669: "IS-IS commands\n"
1670: "Set priority for Designated Router election\n"
1671: "Specify priority for level-1 routing\n")
1672: {
1.1.1.2 misho 1673: struct isis_circuit *circuit = isis_circuit_lookup (vty);
1674: if (!circuit)
1675: return CMD_ERR_NO_MATCH;
1.1 misho 1676:
1.1.1.2 misho 1677: circuit->priority[0] = DEFAULT_PRIORITY;
1.1 misho 1678:
1679: return CMD_SUCCESS;
1680: }
1681:
1682: ALIAS (no_isis_priority_l1,
1683: no_isis_priority_l1_arg_cmd,
1684: "no isis priority <0-127> level-1",
1685: NO_STR
1686: "IS-IS commands\n"
1687: "Set priority for Designated Router election\n"
1688: "Priority value\n"
1689: "Specify priority for level-1 routing\n")
1690:
1691: DEFUN (isis_priority_l2,
1692: isis_priority_l2_cmd,
1693: "isis priority <0-127> level-2",
1694: "IS-IS commands\n"
1695: "Set priority for Designated Router election\n"
1696: "Priority value\n"
1697: "Specify priority for level-2 routing\n")
1698: {
1699: int prio;
1.1.1.2 misho 1700: struct isis_circuit *circuit = isis_circuit_lookup (vty);
1701: if (!circuit)
1702: return CMD_ERR_NO_MATCH;
1.1 misho 1703:
1.1.1.2 misho 1704: prio = atoi (argv[0]);
1705: if (prio < MIN_PRIORITY || prio > MAX_PRIORITY)
1.1 misho 1706: {
1.1.1.2 misho 1707: vty_out (vty, "Invalid priority %d - should be <0-127>%s",
1708: prio, VTY_NEWLINE);
1709: return CMD_ERR_AMBIGUOUS;
1.1 misho 1710: }
1711:
1.1.1.2 misho 1712: circuit->priority[1] = prio;
1.1 misho 1713:
1714: return CMD_SUCCESS;
1715: }
1716:
1717: DEFUN (no_isis_priority_l2,
1718: no_isis_priority_l2_cmd,
1719: "no isis priority level-2",
1720: NO_STR
1721: "IS-IS commands\n"
1722: "Set priority for Designated Router election\n"
1723: "Specify priority for level-2 routing\n")
1724: {
1.1.1.2 misho 1725: struct isis_circuit *circuit = isis_circuit_lookup (vty);
1726: if (!circuit)
1727: return CMD_ERR_NO_MATCH;
1.1 misho 1728:
1.1.1.2 misho 1729: circuit->priority[1] = DEFAULT_PRIORITY;
1.1 misho 1730:
1731: return CMD_SUCCESS;
1732: }
1733:
1734: ALIAS (no_isis_priority_l2,
1735: no_isis_priority_l2_arg_cmd,
1736: "no isis priority <0-127> level-2",
1737: NO_STR
1738: "IS-IS commands\n"
1739: "Set priority for Designated Router election\n"
1740: "Priority value\n"
1741: "Specify priority for level-2 routing\n")
1742:
1743: /* Metric command */
1.1.1.2 misho 1744: DEFUN (isis_metric,
1.1 misho 1745: isis_metric_cmd,
1746: "isis metric <0-16777215>",
1747: "IS-IS commands\n"
1748: "Set default metric for circuit\n"
1749: "Default metric value\n")
1750: {
1751: int met;
1.1.1.2 misho 1752: struct isis_circuit *circuit = isis_circuit_lookup (vty);
1753: if (!circuit)
1754: return CMD_ERR_NO_MATCH;
1.1 misho 1755:
1756: met = atoi (argv[0]);
1757:
1.1.1.2 misho 1758: /* RFC3787 section 5.1 */
1759: if (circuit->area && circuit->area->oldmetric == 1 &&
1760: met > MAX_NARROW_LINK_METRIC)
1761: {
1762: vty_out (vty, "Invalid metric %d - should be <0-63> "
1763: "when narrow metric type enabled%s",
1764: met, VTY_NEWLINE);
1765: return CMD_ERR_AMBIGUOUS;
1766: }
1767:
1768: /* RFC4444 */
1769: if (circuit->area && circuit->area->newmetric == 1 &&
1770: met > MAX_WIDE_LINK_METRIC)
1771: {
1772: vty_out (vty, "Invalid metric %d - should be <0-16777215> "
1773: "when wide metric type enabled%s",
1774: met, VTY_NEWLINE);
1775: return CMD_ERR_AMBIGUOUS;
1776: }
1777:
1.1 misho 1778: circuit->te_metric[0] = met;
1779: circuit->te_metric[1] = met;
1780:
1781: circuit->metrics[0].metric_default = met;
1782: circuit->metrics[1].metric_default = met;
1783:
1.1.1.2 misho 1784: if (circuit->area)
1785: lsp_regenerate_schedule (circuit->area, circuit->is_type, 0);
1786:
1.1 misho 1787: return CMD_SUCCESS;
1788: }
1789:
1790: DEFUN (no_isis_metric,
1791: no_isis_metric_cmd,
1792: "no isis metric",
1793: NO_STR
1794: "IS-IS commands\n"
1795: "Set default metric for circuit\n")
1796: {
1.1.1.2 misho 1797: struct isis_circuit *circuit = isis_circuit_lookup (vty);
1798: if (!circuit)
1799: return CMD_ERR_NO_MATCH;
1.1 misho 1800:
1.1.1.2 misho 1801: circuit->te_metric[0] = DEFAULT_CIRCUIT_METRIC;
1802: circuit->te_metric[1] = DEFAULT_CIRCUIT_METRIC;
1803: circuit->metrics[0].metric_default = DEFAULT_CIRCUIT_METRIC;
1804: circuit->metrics[1].metric_default = DEFAULT_CIRCUIT_METRIC;
1.1 misho 1805:
1.1.1.2 misho 1806: if (circuit->area)
1807: lsp_regenerate_schedule (circuit->area, circuit->is_type, 0);
1.1 misho 1808:
1809: return CMD_SUCCESS;
1810: }
1811:
1812: ALIAS (no_isis_metric,
1813: no_isis_metric_arg_cmd,
1814: "no isis metric <0-16777215>",
1815: NO_STR
1816: "IS-IS commands\n"
1817: "Set default metric for circuit\n"
1818: "Default metric value\n")
1819:
1.1.1.2 misho 1820: DEFUN (isis_metric_l1,
1821: isis_metric_l1_cmd,
1822: "isis metric <0-16777215> level-1",
1823: "IS-IS commands\n"
1824: "Set default metric for circuit\n"
1825: "Default metric value\n"
1826: "Specify metric for level-1 routing\n")
1827: {
1828: int met;
1829: struct isis_circuit *circuit = isis_circuit_lookup (vty);
1830: if (!circuit)
1831: return CMD_ERR_NO_MATCH;
1832:
1833: met = atoi (argv[0]);
1834:
1835: /* RFC3787 section 5.1 */
1836: if (circuit->area && circuit->area->oldmetric == 1 &&
1837: met > MAX_NARROW_LINK_METRIC)
1838: {
1839: vty_out (vty, "Invalid metric %d - should be <0-63> "
1840: "when narrow metric type enabled%s",
1841: met, VTY_NEWLINE);
1842: return CMD_ERR_AMBIGUOUS;
1843: }
1844:
1845: /* RFC4444 */
1846: if (circuit->area && circuit->area->newmetric == 1 &&
1847: met > MAX_WIDE_LINK_METRIC)
1848: {
1849: vty_out (vty, "Invalid metric %d - should be <0-16777215> "
1850: "when wide metric type enabled%s",
1851: met, VTY_NEWLINE);
1852: return CMD_ERR_AMBIGUOUS;
1853: }
1854:
1855: circuit->te_metric[0] = met;
1856: circuit->metrics[0].metric_default = met;
1857:
1858: if (circuit->area)
1859: lsp_regenerate_schedule (circuit->area, IS_LEVEL_1, 0);
1860:
1861: return CMD_SUCCESS;
1862: }
1863:
1864: DEFUN (no_isis_metric_l1,
1865: no_isis_metric_l1_cmd,
1866: "no isis metric level-1",
1867: NO_STR
1868: "IS-IS commands\n"
1869: "Set default metric for circuit\n"
1870: "Specify metric for level-1 routing\n")
1871: {
1872: struct isis_circuit *circuit = isis_circuit_lookup (vty);
1873: if (!circuit)
1874: return CMD_ERR_NO_MATCH;
1875:
1876: circuit->te_metric[0] = DEFAULT_CIRCUIT_METRIC;
1877: circuit->metrics[0].metric_default = DEFAULT_CIRCUIT_METRIC;
1878:
1879: if (circuit->area)
1880: lsp_regenerate_schedule (circuit->area, IS_LEVEL_1, 0);
1881:
1882: return CMD_SUCCESS;
1883: }
1884:
1885: ALIAS (no_isis_metric_l1,
1886: no_isis_metric_l1_arg_cmd,
1887: "no isis metric <0-16777215> level-1",
1888: NO_STR
1889: "IS-IS commands\n"
1890: "Set default metric for circuit\n"
1891: "Default metric value\n"
1892: "Specify metric for level-1 routing\n")
1893:
1894: DEFUN (isis_metric_l2,
1895: isis_metric_l2_cmd,
1896: "isis metric <0-16777215> level-2",
1897: "IS-IS commands\n"
1898: "Set default metric for circuit\n"
1899: "Default metric value\n"
1900: "Specify metric for level-2 routing\n")
1901: {
1902: int met;
1903: struct isis_circuit *circuit = isis_circuit_lookup (vty);
1904: if (!circuit)
1905: return CMD_ERR_NO_MATCH;
1906:
1907: met = atoi (argv[0]);
1908:
1909: /* RFC3787 section 5.1 */
1910: if (circuit->area && circuit->area->oldmetric == 1 &&
1911: met > MAX_NARROW_LINK_METRIC)
1912: {
1913: vty_out (vty, "Invalid metric %d - should be <0-63> "
1914: "when narrow metric type enabled%s",
1915: met, VTY_NEWLINE);
1916: return CMD_ERR_AMBIGUOUS;
1917: }
1918:
1919: /* RFC4444 */
1920: if (circuit->area && circuit->area->newmetric == 1 &&
1921: met > MAX_WIDE_LINK_METRIC)
1922: {
1923: vty_out (vty, "Invalid metric %d - should be <0-16777215> "
1924: "when wide metric type enabled%s",
1925: met, VTY_NEWLINE);
1926: return CMD_ERR_AMBIGUOUS;
1927: }
1928:
1929: circuit->te_metric[1] = met;
1930: circuit->metrics[1].metric_default = met;
1931:
1932: if (circuit->area)
1933: lsp_regenerate_schedule (circuit->area, IS_LEVEL_2, 0);
1934:
1935: return CMD_SUCCESS;
1936: }
1937:
1938: DEFUN (no_isis_metric_l2,
1939: no_isis_metric_l2_cmd,
1940: "no isis metric level-2",
1941: NO_STR
1942: "IS-IS commands\n"
1943: "Set default metric for circuit\n"
1944: "Specify metric for level-2 routing\n")
1945: {
1946: struct isis_circuit *circuit = isis_circuit_lookup (vty);
1947: if (!circuit)
1948: return CMD_ERR_NO_MATCH;
1949:
1950: circuit->te_metric[1] = DEFAULT_CIRCUIT_METRIC;
1951: circuit->metrics[1].metric_default = DEFAULT_CIRCUIT_METRIC;
1952:
1953: if (circuit->area)
1954: lsp_regenerate_schedule (circuit->area, IS_LEVEL_2, 0);
1955:
1956: return CMD_SUCCESS;
1957: }
1958:
1959: ALIAS (no_isis_metric_l2,
1960: no_isis_metric_l2_arg_cmd,
1961: "no isis metric <0-16777215> level-2",
1962: NO_STR
1963: "IS-IS commands\n"
1964: "Set default metric for circuit\n"
1965: "Default metric value\n"
1966: "Specify metric for level-2 routing\n")
1.1 misho 1967: /* end of metrics */
1.1.1.2 misho 1968:
1.1 misho 1969: DEFUN (isis_hello_interval,
1970: isis_hello_interval_cmd,
1.1.1.2 misho 1971: "isis hello-interval <1-600>",
1.1 misho 1972: "IS-IS commands\n"
1973: "Set Hello interval\n"
1974: "Hello interval value\n"
1975: "Holdtime 1 seconds, interval depends on multiplier\n")
1976: {
1977: int interval;
1.1.1.2 misho 1978: struct isis_circuit *circuit = isis_circuit_lookup (vty);
1979: if (!circuit)
1980: return CMD_ERR_NO_MATCH;
1.1 misho 1981:
1.1.1.2 misho 1982: interval = atoi (argv[0]);
1983: if (interval < MIN_HELLO_INTERVAL || interval > MAX_HELLO_INTERVAL)
1.1 misho 1984: {
1.1.1.2 misho 1985: vty_out (vty, "Invalid hello-interval %d - should be <1-600>%s",
1986: interval, VTY_NEWLINE);
1987: return CMD_ERR_AMBIGUOUS;
1.1 misho 1988: }
1989:
1990: circuit->hello_interval[0] = (u_int16_t) interval;
1991: circuit->hello_interval[1] = (u_int16_t) interval;
1992:
1993: return CMD_SUCCESS;
1994: }
1995:
1996: DEFUN (no_isis_hello_interval,
1997: no_isis_hello_interval_cmd,
1998: "no isis hello-interval",
1999: NO_STR
2000: "IS-IS commands\n"
2001: "Set Hello interval\n")
2002: {
1.1.1.2 misho 2003: struct isis_circuit *circuit = isis_circuit_lookup (vty);
2004: if (!circuit)
2005: return CMD_ERR_NO_MATCH;
1.1 misho 2006:
1.1.1.2 misho 2007: circuit->hello_interval[0] = DEFAULT_HELLO_INTERVAL;
2008: circuit->hello_interval[1] = DEFAULT_HELLO_INTERVAL;
1.1 misho 2009:
2010: return CMD_SUCCESS;
2011: }
2012:
2013: ALIAS (no_isis_hello_interval,
2014: no_isis_hello_interval_arg_cmd,
1.1.1.2 misho 2015: "no isis hello-interval <1-600>",
1.1 misho 2016: NO_STR
2017: "IS-IS commands\n"
2018: "Set Hello interval\n"
2019: "Hello interval value\n"
2020: "Holdtime 1 second, interval depends on multiplier\n")
2021:
2022: DEFUN (isis_hello_interval_l1,
2023: isis_hello_interval_l1_cmd,
1.1.1.2 misho 2024: "isis hello-interval <1-600> level-1",
1.1 misho 2025: "IS-IS commands\n"
2026: "Set Hello interval\n"
2027: "Hello interval value\n"
2028: "Holdtime 1 second, interval depends on multiplier\n"
2029: "Specify hello-interval for level-1 IIHs\n")
2030: {
2031: long interval;
1.1.1.2 misho 2032: struct isis_circuit *circuit = isis_circuit_lookup (vty);
2033: if (!circuit)
2034: return CMD_ERR_NO_MATCH;
1.1 misho 2035:
1.1.1.2 misho 2036: interval = atoi (argv[0]);
2037: if (interval < MIN_HELLO_INTERVAL || interval > MAX_HELLO_INTERVAL)
1.1 misho 2038: {
1.1.1.2 misho 2039: vty_out (vty, "Invalid hello-interval %ld - should be <1-600>%s",
2040: interval, VTY_NEWLINE);
2041: return CMD_ERR_AMBIGUOUS;
1.1 misho 2042: }
2043:
2044: circuit->hello_interval[0] = (u_int16_t) interval;
2045:
2046: return CMD_SUCCESS;
2047: }
2048:
2049: DEFUN (no_isis_hello_interval_l1,
2050: no_isis_hello_interval_l1_cmd,
2051: "no isis hello-interval level-1",
2052: NO_STR
2053: "IS-IS commands\n"
2054: "Set Hello interval\n"
2055: "Specify hello-interval for level-1 IIHs\n")
2056: {
1.1.1.2 misho 2057: struct isis_circuit *circuit = isis_circuit_lookup (vty);
2058: if (!circuit)
2059: return CMD_ERR_NO_MATCH;
1.1 misho 2060:
1.1.1.2 misho 2061: circuit->hello_interval[0] = DEFAULT_HELLO_INTERVAL;
1.1 misho 2062:
2063: return CMD_SUCCESS;
2064: }
2065:
2066: ALIAS (no_isis_hello_interval_l1,
2067: no_isis_hello_interval_l1_arg_cmd,
1.1.1.2 misho 2068: "no isis hello-interval <1-600> level-1",
1.1 misho 2069: NO_STR
2070: "IS-IS commands\n"
2071: "Set Hello interval\n"
2072: "Hello interval value\n"
2073: "Holdtime 1 second, interval depends on multiplier\n"
2074: "Specify hello-interval for level-1 IIHs\n")
2075:
2076: DEFUN (isis_hello_interval_l2,
2077: isis_hello_interval_l2_cmd,
1.1.1.2 misho 2078: "isis hello-interval <1-600> level-2",
1.1 misho 2079: "IS-IS commands\n"
2080: "Set Hello interval\n"
2081: "Hello interval value\n"
2082: "Holdtime 1 second, interval depends on multiplier\n"
2083: "Specify hello-interval for level-2 IIHs\n")
2084: {
2085: long interval;
1.1.1.2 misho 2086: struct isis_circuit *circuit = isis_circuit_lookup (vty);
2087: if (!circuit)
2088: return CMD_ERR_NO_MATCH;
1.1 misho 2089:
1.1.1.2 misho 2090: interval = atoi (argv[0]);
2091: if (interval < MIN_HELLO_INTERVAL || interval > MAX_HELLO_INTERVAL)
1.1 misho 2092: {
1.1.1.2 misho 2093: vty_out (vty, "Invalid hello-interval %ld - should be <1-600>%s",
2094: interval, VTY_NEWLINE);
2095: return CMD_ERR_AMBIGUOUS;
1.1 misho 2096: }
2097:
2098: circuit->hello_interval[1] = (u_int16_t) interval;
2099:
2100: return CMD_SUCCESS;
2101: }
2102:
2103: DEFUN (no_isis_hello_interval_l2,
2104: no_isis_hello_interval_l2_cmd,
1.1.1.2 misho 2105: "no isis hello-interval level-2",
2106: NO_STR
2107: "IS-IS commands\n"
2108: "Set Hello interval\n"
2109: "Specify hello-interval for level-2 IIHs\n")
2110: {
2111: struct isis_circuit *circuit = isis_circuit_lookup (vty);
2112: if (!circuit)
2113: return CMD_ERR_NO_MATCH;
1.1 misho 2114:
1.1.1.2 misho 2115: circuit->hello_interval[1] = DEFAULT_HELLO_INTERVAL;
1.1 misho 2116:
2117: return CMD_SUCCESS;
2118: }
2119:
2120: ALIAS (no_isis_hello_interval_l2,
2121: no_isis_hello_interval_l2_arg_cmd,
1.1.1.2 misho 2122: "no isis hello-interval <1-600> level-2",
1.1 misho 2123: NO_STR
2124: "IS-IS commands\n"
2125: "Set Hello interval\n"
2126: "Hello interval value\n"
2127: "Holdtime 1 second, interval depends on multiplier\n"
2128: "Specify hello-interval for level-2 IIHs\n")
2129:
2130: DEFUN (isis_hello_multiplier,
2131: isis_hello_multiplier_cmd,
1.1.1.2 misho 2132: "isis hello-multiplier <2-100>",
1.1 misho 2133: "IS-IS commands\n"
2134: "Set multiplier for Hello holding time\n"
2135: "Hello multiplier value\n")
2136: {
2137: int mult;
1.1.1.2 misho 2138: struct isis_circuit *circuit = isis_circuit_lookup (vty);
2139: if (!circuit)
2140: return CMD_ERR_NO_MATCH;
1.1 misho 2141:
1.1.1.2 misho 2142: mult = atoi (argv[0]);
2143: if (mult < MIN_HELLO_MULTIPLIER || mult > MAX_HELLO_MULTIPLIER)
1.1 misho 2144: {
1.1.1.2 misho 2145: vty_out (vty, "Invalid hello-multiplier %d - should be <2-100>%s",
2146: mult, VTY_NEWLINE);
2147: return CMD_ERR_AMBIGUOUS;
1.1 misho 2148: }
2149:
2150: circuit->hello_multiplier[0] = (u_int16_t) mult;
2151: circuit->hello_multiplier[1] = (u_int16_t) mult;
2152:
2153: return CMD_SUCCESS;
2154: }
2155:
2156: DEFUN (no_isis_hello_multiplier,
2157: no_isis_hello_multiplier_cmd,
2158: "no isis hello-multiplier",
2159: NO_STR
2160: "IS-IS commands\n"
2161: "Set multiplier for Hello holding time\n")
2162: {
1.1.1.2 misho 2163: struct isis_circuit *circuit = isis_circuit_lookup (vty);
2164: if (!circuit)
2165: return CMD_ERR_NO_MATCH;
1.1 misho 2166:
1.1.1.2 misho 2167: circuit->hello_multiplier[0] = DEFAULT_HELLO_MULTIPLIER;
2168: circuit->hello_multiplier[1] = DEFAULT_HELLO_MULTIPLIER;
1.1 misho 2169:
2170: return CMD_SUCCESS;
2171: }
2172:
2173: ALIAS (no_isis_hello_multiplier,
2174: no_isis_hello_multiplier_arg_cmd,
1.1.1.2 misho 2175: "no isis hello-multiplier <2-100>",
1.1 misho 2176: NO_STR
2177: "IS-IS commands\n"
2178: "Set multiplier for Hello holding time\n"
2179: "Hello multiplier value\n")
2180:
2181: DEFUN (isis_hello_multiplier_l1,
2182: isis_hello_multiplier_l1_cmd,
1.1.1.2 misho 2183: "isis hello-multiplier <2-100> level-1",
1.1 misho 2184: "IS-IS commands\n"
2185: "Set multiplier for Hello holding time\n"
2186: "Hello multiplier value\n"
2187: "Specify hello multiplier for level-1 IIHs\n")
2188: {
2189: int mult;
1.1.1.2 misho 2190: struct isis_circuit *circuit = isis_circuit_lookup (vty);
2191: if (!circuit)
2192: return CMD_ERR_NO_MATCH;
1.1 misho 2193:
1.1.1.2 misho 2194: mult = atoi (argv[0]);
2195: if (mult < MIN_HELLO_MULTIPLIER || mult > MAX_HELLO_MULTIPLIER)
1.1 misho 2196: {
1.1.1.2 misho 2197: vty_out (vty, "Invalid hello-multiplier %d - should be <2-100>%s",
2198: mult, VTY_NEWLINE);
2199: return CMD_ERR_AMBIGUOUS;
1.1 misho 2200: }
2201:
2202: circuit->hello_multiplier[0] = (u_int16_t) mult;
2203:
2204: return CMD_SUCCESS;
2205: }
2206:
2207: DEFUN (no_isis_hello_multiplier_l1,
2208: no_isis_hello_multiplier_l1_cmd,
2209: "no isis hello-multiplier level-1",
2210: NO_STR
2211: "IS-IS commands\n"
2212: "Set multiplier for Hello holding time\n"
2213: "Specify hello multiplier for level-1 IIHs\n")
2214: {
1.1.1.2 misho 2215: struct isis_circuit *circuit = isis_circuit_lookup (vty);
2216: if (!circuit)
2217: return CMD_ERR_NO_MATCH;
1.1 misho 2218:
1.1.1.2 misho 2219: circuit->hello_multiplier[0] = DEFAULT_HELLO_MULTIPLIER;
1.1 misho 2220:
2221: return CMD_SUCCESS;
2222: }
2223:
2224: ALIAS (no_isis_hello_multiplier_l1,
2225: no_isis_hello_multiplier_l1_arg_cmd,
1.1.1.2 misho 2226: "no isis hello-multiplier <2-100> level-1",
1.1 misho 2227: NO_STR
2228: "IS-IS commands\n"
2229: "Set multiplier for Hello holding time\n"
2230: "Hello multiplier value\n"
2231: "Specify hello multiplier for level-1 IIHs\n")
2232:
2233: DEFUN (isis_hello_multiplier_l2,
2234: isis_hello_multiplier_l2_cmd,
1.1.1.2 misho 2235: "isis hello-multiplier <2-100> level-2",
1.1 misho 2236: "IS-IS commands\n"
2237: "Set multiplier for Hello holding time\n"
2238: "Hello multiplier value\n"
2239: "Specify hello multiplier for level-2 IIHs\n")
2240: {
2241: int mult;
1.1.1.2 misho 2242: struct isis_circuit *circuit = isis_circuit_lookup (vty);
2243: if (!circuit)
2244: return CMD_ERR_NO_MATCH;
1.1 misho 2245:
1.1.1.2 misho 2246: mult = atoi (argv[0]);
2247: if (mult < MIN_HELLO_MULTIPLIER || mult > MAX_HELLO_MULTIPLIER)
1.1 misho 2248: {
1.1.1.2 misho 2249: vty_out (vty, "Invalid hello-multiplier %d - should be <2-100>%s",
2250: mult, VTY_NEWLINE);
2251: return CMD_ERR_AMBIGUOUS;
1.1 misho 2252: }
2253:
2254: circuit->hello_multiplier[1] = (u_int16_t) mult;
2255:
2256: return CMD_SUCCESS;
2257: }
2258:
2259: DEFUN (no_isis_hello_multiplier_l2,
2260: no_isis_hello_multiplier_l2_cmd,
2261: "no isis hello-multiplier level-2",
2262: NO_STR
2263: "IS-IS commands\n"
2264: "Set multiplier for Hello holding time\n"
2265: "Specify hello multiplier for level-2 IIHs\n")
2266: {
1.1.1.2 misho 2267: struct isis_circuit *circuit = isis_circuit_lookup (vty);
2268: if (!circuit)
2269: return CMD_ERR_NO_MATCH;
1.1 misho 2270:
1.1.1.2 misho 2271: circuit->hello_multiplier[1] = DEFAULT_HELLO_MULTIPLIER;
1.1 misho 2272:
2273: return CMD_SUCCESS;
2274: }
2275:
2276: ALIAS (no_isis_hello_multiplier_l2,
2277: no_isis_hello_multiplier_l2_arg_cmd,
1.1.1.2 misho 2278: "no isis hello-multiplier <2-100> level-2",
1.1 misho 2279: NO_STR
2280: "IS-IS commands\n"
2281: "Set multiplier for Hello holding time\n"
2282: "Hello multiplier value\n"
2283: "Specify hello multiplier for level-2 IIHs\n")
2284:
1.1.1.2 misho 2285: DEFUN (isis_hello_padding,
2286: isis_hello_padding_cmd,
1.1 misho 2287: "isis hello padding",
2288: "IS-IS commands\n"
2289: "Add padding to IS-IS hello packets\n"
2290: "Pad hello packets\n"
2291: "<cr>\n")
2292: {
1.1.1.2 misho 2293: struct isis_circuit *circuit = isis_circuit_lookup (vty);
2294: if (!circuit)
2295: return CMD_ERR_NO_MATCH;
1.1 misho 2296:
1.1.1.2 misho 2297: circuit->pad_hellos = 1;
1.1 misho 2298:
2299: return CMD_SUCCESS;
2300: }
2301:
1.1.1.2 misho 2302: DEFUN (no_isis_hello_padding,
2303: no_isis_hello_padding_cmd,
1.1 misho 2304: "no isis hello padding",
2305: NO_STR
2306: "IS-IS commands\n"
2307: "Add padding to IS-IS hello packets\n"
2308: "Pad hello packets\n"
2309: "<cr>\n")
2310: {
1.1.1.2 misho 2311: struct isis_circuit *circuit = isis_circuit_lookup (vty);
2312: if (!circuit)
2313: return CMD_ERR_NO_MATCH;
1.1 misho 2314:
1.1.1.2 misho 2315: circuit->pad_hellos = 0;
1.1 misho 2316:
2317: return CMD_SUCCESS;
2318: }
2319:
2320: DEFUN (csnp_interval,
2321: csnp_interval_cmd,
1.1.1.2 misho 2322: "isis csnp-interval <1-600>",
1.1 misho 2323: "IS-IS commands\n"
2324: "Set CSNP interval in seconds\n"
2325: "CSNP interval value\n")
2326: {
2327: unsigned long interval;
1.1.1.2 misho 2328: struct isis_circuit *circuit = isis_circuit_lookup (vty);
2329: if (!circuit)
2330: return CMD_ERR_NO_MATCH;
1.1 misho 2331:
1.1.1.2 misho 2332: interval = atol (argv[0]);
2333: if (interval < MIN_CSNP_INTERVAL || interval > MAX_CSNP_INTERVAL)
1.1 misho 2334: {
1.1.1.2 misho 2335: vty_out (vty, "Invalid csnp-interval %lu - should be <1-600>%s",
2336: interval, VTY_NEWLINE);
2337: return CMD_ERR_AMBIGUOUS;
1.1 misho 2338: }
2339:
2340: circuit->csnp_interval[0] = (u_int16_t) interval;
2341: circuit->csnp_interval[1] = (u_int16_t) interval;
2342:
2343: return CMD_SUCCESS;
2344: }
2345:
2346: DEFUN (no_csnp_interval,
2347: no_csnp_interval_cmd,
2348: "no isis csnp-interval",
2349: NO_STR
2350: "IS-IS commands\n"
2351: "Set CSNP interval in seconds\n")
2352: {
1.1.1.2 misho 2353: struct isis_circuit *circuit = isis_circuit_lookup (vty);
2354: if (!circuit)
2355: return CMD_ERR_NO_MATCH;
1.1 misho 2356:
1.1.1.2 misho 2357: circuit->csnp_interval[0] = DEFAULT_CSNP_INTERVAL;
2358: circuit->csnp_interval[1] = DEFAULT_CSNP_INTERVAL;
1.1 misho 2359:
2360: return CMD_SUCCESS;
2361: }
2362:
2363: ALIAS (no_csnp_interval,
2364: no_csnp_interval_arg_cmd,
1.1.1.2 misho 2365: "no isis csnp-interval <1-600>",
1.1 misho 2366: NO_STR
2367: "IS-IS commands\n"
2368: "Set CSNP interval in seconds\n"
2369: "CSNP interval value\n")
2370:
2371: DEFUN (csnp_interval_l1,
2372: csnp_interval_l1_cmd,
1.1.1.2 misho 2373: "isis csnp-interval <1-600> level-1",
1.1 misho 2374: "IS-IS commands\n"
2375: "Set CSNP interval in seconds\n"
2376: "CSNP interval value\n"
2377: "Specify interval for level-1 CSNPs\n")
2378: {
2379: unsigned long interval;
1.1.1.2 misho 2380: struct isis_circuit *circuit = isis_circuit_lookup (vty);
2381: if (!circuit)
2382: return CMD_ERR_NO_MATCH;
1.1 misho 2383:
1.1.1.2 misho 2384: interval = atol (argv[0]);
2385: if (interval < MIN_CSNP_INTERVAL || interval > MAX_CSNP_INTERVAL)
1.1 misho 2386: {
1.1.1.2 misho 2387: vty_out (vty, "Invalid csnp-interval %lu - should be <1-600>%s",
2388: interval, VTY_NEWLINE);
2389: return CMD_ERR_AMBIGUOUS;
1.1 misho 2390: }
2391:
2392: circuit->csnp_interval[0] = (u_int16_t) interval;
2393:
2394: return CMD_SUCCESS;
2395: }
2396:
2397: DEFUN (no_csnp_interval_l1,
2398: no_csnp_interval_l1_cmd,
2399: "no isis csnp-interval level-1",
2400: NO_STR
2401: "IS-IS commands\n"
2402: "Set CSNP interval in seconds\n"
2403: "Specify interval for level-1 CSNPs\n")
2404: {
1.1.1.2 misho 2405: struct isis_circuit *circuit = isis_circuit_lookup (vty);
2406: if (!circuit)
2407: return CMD_ERR_NO_MATCH;
1.1 misho 2408:
1.1.1.2 misho 2409: circuit->csnp_interval[0] = DEFAULT_CSNP_INTERVAL;
1.1 misho 2410:
2411: return CMD_SUCCESS;
2412: }
2413:
2414: ALIAS (no_csnp_interval_l1,
2415: no_csnp_interval_l1_arg_cmd,
1.1.1.2 misho 2416: "no isis csnp-interval <1-600> level-1",
1.1 misho 2417: NO_STR
2418: "IS-IS commands\n"
2419: "Set CSNP interval in seconds\n"
2420: "CSNP interval value\n"
2421: "Specify interval for level-1 CSNPs\n")
2422:
2423: DEFUN (csnp_interval_l2,
2424: csnp_interval_l2_cmd,
1.1.1.2 misho 2425: "isis csnp-interval <1-600> level-2",
1.1 misho 2426: "IS-IS commands\n"
2427: "Set CSNP interval in seconds\n"
2428: "CSNP interval value\n"
2429: "Specify interval for level-2 CSNPs\n")
2430: {
2431: unsigned long interval;
1.1.1.2 misho 2432: struct isis_circuit *circuit = isis_circuit_lookup (vty);
2433: if (!circuit)
2434: return CMD_ERR_NO_MATCH;
1.1 misho 2435:
1.1.1.2 misho 2436: interval = atol (argv[0]);
2437: if (interval < MIN_CSNP_INTERVAL || interval > MAX_CSNP_INTERVAL)
1.1 misho 2438: {
1.1.1.2 misho 2439: vty_out (vty, "Invalid csnp-interval %lu - should be <1-600>%s",
2440: interval, VTY_NEWLINE);
2441: return CMD_ERR_AMBIGUOUS;
1.1 misho 2442: }
2443:
2444: circuit->csnp_interval[1] = (u_int16_t) interval;
2445:
2446: return CMD_SUCCESS;
2447: }
2448:
2449: DEFUN (no_csnp_interval_l2,
2450: no_csnp_interval_l2_cmd,
2451: "no isis csnp-interval level-2",
2452: NO_STR
2453: "IS-IS commands\n"
2454: "Set CSNP interval in seconds\n"
2455: "Specify interval for level-2 CSNPs\n")
2456: {
1.1.1.2 misho 2457: struct isis_circuit *circuit = isis_circuit_lookup (vty);
2458: if (!circuit)
2459: return CMD_ERR_NO_MATCH;
1.1 misho 2460:
1.1.1.2 misho 2461: circuit->csnp_interval[1] = DEFAULT_CSNP_INTERVAL;
1.1 misho 2462:
2463: return CMD_SUCCESS;
2464: }
2465:
2466: ALIAS (no_csnp_interval_l2,
2467: no_csnp_interval_l2_arg_cmd,
1.1.1.2 misho 2468: "no isis csnp-interval <1-600> level-2",
1.1 misho 2469: NO_STR
2470: "IS-IS commands\n"
2471: "Set CSNP interval in seconds\n"
2472: "CSNP interval value\n"
2473: "Specify interval for level-2 CSNPs\n")
2474:
1.1.1.2 misho 2475: DEFUN (psnp_interval,
2476: psnp_interval_cmd,
2477: "isis psnp-interval <1-120>",
2478: "IS-IS commands\n"
2479: "Set PSNP interval in seconds\n"
2480: "PSNP interval value\n")
1.1 misho 2481: {
1.1.1.2 misho 2482: unsigned long interval;
2483: struct isis_circuit *circuit = isis_circuit_lookup (vty);
2484: if (!circuit)
2485: return CMD_ERR_NO_MATCH;
1.1 misho 2486:
1.1.1.2 misho 2487: interval = atol (argv[0]);
2488: if (interval < MIN_PSNP_INTERVAL || interval > MAX_PSNP_INTERVAL)
2489: {
2490: vty_out (vty, "Invalid psnp-interval %lu - should be <1-120>%s",
2491: interval, VTY_NEWLINE);
2492: return CMD_ERR_AMBIGUOUS;
2493: }
1.1 misho 2494:
1.1.1.2 misho 2495: circuit->psnp_interval[0] = (u_int16_t) interval;
2496: circuit->psnp_interval[1] = (u_int16_t) interval;
1.1 misho 2497:
1.1.1.2 misho 2498: return CMD_SUCCESS;
2499: }
1.1 misho 2500:
1.1.1.2 misho 2501: DEFUN (no_psnp_interval,
2502: no_psnp_interval_cmd,
2503: "no isis psnp-interval",
2504: NO_STR
2505: "IS-IS commands\n"
2506: "Set PSNP interval in seconds\n")
2507: {
2508: struct isis_circuit *circuit = isis_circuit_lookup (vty);
2509: if (!circuit)
2510: return CMD_ERR_NO_MATCH;
1.1 misho 2511:
1.1.1.2 misho 2512: circuit->psnp_interval[0] = DEFAULT_PSNP_INTERVAL;
2513: circuit->psnp_interval[1] = DEFAULT_PSNP_INTERVAL;
2514:
2515: return CMD_SUCCESS;
2516: }
2517:
2518: ALIAS (no_psnp_interval,
2519: no_psnp_interval_arg_cmd,
2520: "no isis psnp-interval <1-120>",
2521: NO_STR
2522: "IS-IS commands\n"
2523: "Set PSNP interval in seconds\n"
2524: "PSNP interval value\n")
2525:
2526: DEFUN (psnp_interval_l1,
2527: psnp_interval_l1_cmd,
2528: "isis psnp-interval <1-120> level-1",
2529: "IS-IS commands\n"
2530: "Set PSNP interval in seconds\n"
2531: "PSNP interval value\n"
2532: "Specify interval for level-1 PSNPs\n")
2533: {
2534: unsigned long interval;
2535: struct isis_circuit *circuit = isis_circuit_lookup (vty);
2536: if (!circuit)
2537: return CMD_ERR_NO_MATCH;
1.1 misho 2538:
1.1.1.2 misho 2539: interval = atol (argv[0]);
2540: if (interval < MIN_PSNP_INTERVAL || interval > MAX_PSNP_INTERVAL)
1.1 misho 2541: {
1.1.1.2 misho 2542: vty_out (vty, "Invalid psnp-interval %lu - should be <1-120>%s",
2543: interval, VTY_NEWLINE);
2544: return CMD_ERR_AMBIGUOUS;
1.1 misho 2545: }
2546:
1.1.1.2 misho 2547: circuit->psnp_interval[0] = (u_int16_t) interval;
1.1 misho 2548:
1.1.1.2 misho 2549: return CMD_SUCCESS;
2550: }
1.1 misho 2551:
1.1.1.2 misho 2552: DEFUN (no_psnp_interval_l1,
2553: no_psnp_interval_l1_cmd,
2554: "no isis psnp-interval level-1",
2555: NO_STR
2556: "IS-IS commands\n"
2557: "Set PSNP interval in seconds\n"
2558: "Specify interval for level-1 PSNPs\n")
2559: {
2560: struct isis_circuit *circuit = isis_circuit_lookup (vty);
2561: if (!circuit)
2562: return CMD_ERR_NO_MATCH;
2563:
2564: circuit->psnp_interval[0] = DEFAULT_PSNP_INTERVAL;
1.1 misho 2565:
2566: return CMD_SUCCESS;
2567: }
2568:
1.1.1.2 misho 2569: ALIAS (no_psnp_interval_l1,
2570: no_psnp_interval_l1_arg_cmd,
2571: "no isis psnp-interval <1-120> level-1",
1.1 misho 2572: NO_STR
1.1.1.2 misho 2573: "IS-IS commands\n"
2574: "Set PSNP interval in seconds\n"
2575: "PSNP interval value\n"
2576: "Specify interval for level-1 PSNPs\n")
1.1 misho 2577:
1.1.1.2 misho 2578: DEFUN (psnp_interval_l2,
2579: psnp_interval_l2_cmd,
2580: "isis psnp-interval <1-120> level-2",
2581: "IS-IS commands\n"
2582: "Set PSNP interval in seconds\n"
2583: "PSNP interval value\n"
2584: "Specify interval for level-2 PSNPs\n")
2585: {
2586: unsigned long interval;
2587: struct isis_circuit *circuit = isis_circuit_lookup (vty);
2588: if (!circuit)
2589: return CMD_ERR_NO_MATCH;
1.1 misho 2590:
1.1.1.2 misho 2591: interval = atol (argv[0]);
2592: if (interval < MIN_PSNP_INTERVAL || interval > MAX_PSNP_INTERVAL)
1.1 misho 2593: {
1.1.1.2 misho 2594: vty_out (vty, "Invalid psnp-interval %lu - should be <1-120>%s",
2595: interval, VTY_NEWLINE);
2596: return CMD_ERR_AMBIGUOUS;
1.1 misho 2597: }
2598:
1.1.1.2 misho 2599: circuit->psnp_interval[1] = (u_int16_t) interval;
1.1 misho 2600:
1.1.1.2 misho 2601: return CMD_SUCCESS;
2602: }
2603:
2604: DEFUN (no_psnp_interval_l2,
2605: no_psnp_interval_l2_cmd,
2606: "no isis psnp-interval level-2",
2607: NO_STR
2608: "IS-IS commands\n"
2609: "Set PSNP interval in seconds\n"
2610: "Specify interval for level-2 PSNPs\n")
2611: {
2612: struct isis_circuit *circuit = isis_circuit_lookup (vty);
2613: if (!circuit)
2614: return CMD_ERR_NO_MATCH;
2615:
2616: circuit->psnp_interval[1] = DEFAULT_PSNP_INTERVAL;
1.1 misho 2617:
2618: return CMD_SUCCESS;
2619: }
2620:
1.1.1.2 misho 2621: ALIAS (no_psnp_interval_l2,
2622: no_psnp_interval_l2_arg_cmd,
2623: "no isis psnp-interval <1-120> level-2",
2624: NO_STR
2625: "IS-IS commands\n"
2626: "Set PSNP interval in seconds\n"
2627: "PSNP interval value\n"
2628: "Specify interval for level-2 PSNPs\n")
2629:
2630: struct cmd_node interface_node = {
1.1 misho 2631: INTERFACE_NODE,
2632: "%s(config-if)# ",
2633: 1,
2634: };
2635:
1.1.1.2 misho 2636: DEFUN (isis_network,
2637: isis_network_cmd,
2638: "isis network point-to-point",
2639: "IS-IS commands\n"
2640: "Set network type\n"
2641: "point-to-point network type\n")
2642: {
2643: struct isis_circuit *circuit = isis_circuit_lookup (vty);
2644: if (!circuit)
2645: return CMD_ERR_NO_MATCH;
2646:
2647: /* RFC5309 section 4 */
2648: if (circuit->circ_type == CIRCUIT_T_P2P)
2649: return CMD_SUCCESS;
2650:
2651: if (circuit->state != C_STATE_UP)
2652: {
2653: circuit->circ_type = CIRCUIT_T_P2P;
2654: circuit->circ_type_config = CIRCUIT_T_P2P;
2655: }
2656: else
2657: {
2658: struct isis_area *area = circuit->area;
2659: if (!if_is_broadcast (circuit->interface))
2660: {
2661: vty_out (vty, "isis network point-to-point "
2662: "is valid only on broadcast interfaces%s",
2663: VTY_NEWLINE);
2664: return CMD_ERR_AMBIGUOUS;
2665: }
2666:
2667: isis_csm_state_change (ISIS_DISABLE, circuit, area);
2668: circuit->circ_type = CIRCUIT_T_P2P;
2669: circuit->circ_type_config = CIRCUIT_T_P2P;
2670: isis_csm_state_change (ISIS_ENABLE, circuit, area);
2671: }
2672:
2673: return CMD_SUCCESS;
2674: }
2675:
2676: DEFUN (no_isis_network,
2677: no_isis_network_cmd,
2678: "no isis network point-to-point",
2679: NO_STR
2680: "IS-IS commands\n"
2681: "Set network type for circuit\n"
2682: "point-to-point network type\n")
2683: {
2684: struct isis_circuit *circuit = isis_circuit_lookup (vty);
2685: if (!circuit)
2686: return CMD_ERR_NO_MATCH;
2687:
2688: /* RFC5309 section 4 */
2689: if (circuit->circ_type == CIRCUIT_T_BROADCAST)
2690: return CMD_SUCCESS;
2691:
2692: if (circuit->state != C_STATE_UP)
2693: {
2694: circuit->circ_type = CIRCUIT_T_BROADCAST;
2695: circuit->circ_type_config = CIRCUIT_T_BROADCAST;
2696: }
2697: else
2698: {
2699: struct isis_area *area = circuit->area;
2700: if (circuit->interface &&
2701: !if_is_broadcast (circuit->interface))
2702: {
2703: vty_out (vty, "no isis network point-to-point "
2704: "is valid only on broadcast interfaces%s",
2705: VTY_NEWLINE);
2706: return CMD_ERR_AMBIGUOUS;
2707: }
2708:
2709: isis_csm_state_change (ISIS_DISABLE, circuit, area);
2710: circuit->circ_type = CIRCUIT_T_BROADCAST;
2711: circuit->circ_type_config = CIRCUIT_T_BROADCAST;
2712: isis_csm_state_change (ISIS_ENABLE, circuit, area);
2713: }
2714:
2715: return CMD_SUCCESS;
2716: }
2717:
1.1 misho 2718: int
2719: isis_if_new_hook (struct interface *ifp)
2720: {
2721: return 0;
2722: }
2723:
2724: int
2725: isis_if_delete_hook (struct interface *ifp)
2726: {
1.1.1.2 misho 2727: struct isis_circuit *circuit;
2728: /* Clean up the circuit data */
2729: if (ifp && ifp->info)
2730: {
2731: circuit = ifp->info;
2732: isis_csm_state_change (IF_DOWN_FROM_Z, circuit, circuit->area);
2733: isis_csm_state_change (ISIS_DISABLE, circuit, circuit->area);
2734: }
2735:
1.1 misho 2736: return 0;
2737: }
2738:
2739: void
2740: isis_circuit_init ()
2741: {
2742: /* Initialize Zebra interface data structure */
2743: if_init ();
2744: if_add_hook (IF_NEW_HOOK, isis_if_new_hook);
2745: if_add_hook (IF_DELETE_HOOK, isis_if_delete_hook);
2746:
2747: /* Install interface node */
2748: install_node (&interface_node, isis_interface_config_write);
2749: install_element (CONFIG_NODE, &interface_cmd);
1.1.1.2 misho 2750: install_element (CONFIG_NODE, &no_interface_cmd);
1.1 misho 2751:
2752: install_default (INTERFACE_NODE);
2753: install_element (INTERFACE_NODE, &interface_desc_cmd);
2754: install_element (INTERFACE_NODE, &no_interface_desc_cmd);
2755:
2756: install_element (INTERFACE_NODE, &ip_router_isis_cmd);
2757: install_element (INTERFACE_NODE, &no_ip_router_isis_cmd);
2758:
1.1.1.2 misho 2759: install_element (INTERFACE_NODE, &isis_passive_cmd);
2760: install_element (INTERFACE_NODE, &no_isis_passive_cmd);
2761:
1.1 misho 2762: install_element (INTERFACE_NODE, &isis_circuit_type_cmd);
2763: install_element (INTERFACE_NODE, &no_isis_circuit_type_cmd);
2764:
1.1.1.2 misho 2765: install_element (INTERFACE_NODE, &isis_passwd_clear_cmd);
2766: install_element (INTERFACE_NODE, &isis_passwd_md5_cmd);
1.1 misho 2767: install_element (INTERFACE_NODE, &no_isis_passwd_cmd);
2768:
2769: install_element (INTERFACE_NODE, &isis_priority_cmd);
2770: install_element (INTERFACE_NODE, &no_isis_priority_cmd);
2771: install_element (INTERFACE_NODE, &no_isis_priority_arg_cmd);
2772: install_element (INTERFACE_NODE, &isis_priority_l1_cmd);
2773: install_element (INTERFACE_NODE, &no_isis_priority_l1_cmd);
2774: install_element (INTERFACE_NODE, &no_isis_priority_l1_arg_cmd);
2775: install_element (INTERFACE_NODE, &isis_priority_l2_cmd);
2776: install_element (INTERFACE_NODE, &no_isis_priority_l2_cmd);
2777: install_element (INTERFACE_NODE, &no_isis_priority_l2_arg_cmd);
2778:
2779: install_element (INTERFACE_NODE, &isis_metric_cmd);
2780: install_element (INTERFACE_NODE, &no_isis_metric_cmd);
2781: install_element (INTERFACE_NODE, &no_isis_metric_arg_cmd);
1.1.1.2 misho 2782: install_element (INTERFACE_NODE, &isis_metric_l1_cmd);
2783: install_element (INTERFACE_NODE, &no_isis_metric_l1_cmd);
2784: install_element (INTERFACE_NODE, &no_isis_metric_l1_arg_cmd);
2785: install_element (INTERFACE_NODE, &isis_metric_l2_cmd);
2786: install_element (INTERFACE_NODE, &no_isis_metric_l2_cmd);
2787: install_element (INTERFACE_NODE, &no_isis_metric_l2_arg_cmd);
1.1 misho 2788:
2789: install_element (INTERFACE_NODE, &isis_hello_interval_cmd);
2790: install_element (INTERFACE_NODE, &no_isis_hello_interval_cmd);
2791: install_element (INTERFACE_NODE, &no_isis_hello_interval_arg_cmd);
2792: install_element (INTERFACE_NODE, &isis_hello_interval_l1_cmd);
2793: install_element (INTERFACE_NODE, &no_isis_hello_interval_l1_cmd);
2794: install_element (INTERFACE_NODE, &no_isis_hello_interval_l1_arg_cmd);
2795: install_element (INTERFACE_NODE, &isis_hello_interval_l2_cmd);
2796: install_element (INTERFACE_NODE, &no_isis_hello_interval_l2_cmd);
2797: install_element (INTERFACE_NODE, &no_isis_hello_interval_l2_arg_cmd);
2798:
2799: install_element (INTERFACE_NODE, &isis_hello_multiplier_cmd);
2800: install_element (INTERFACE_NODE, &no_isis_hello_multiplier_cmd);
2801: install_element (INTERFACE_NODE, &no_isis_hello_multiplier_arg_cmd);
2802: install_element (INTERFACE_NODE, &isis_hello_multiplier_l1_cmd);
2803: install_element (INTERFACE_NODE, &no_isis_hello_multiplier_l1_cmd);
2804: install_element (INTERFACE_NODE, &no_isis_hello_multiplier_l1_arg_cmd);
2805: install_element (INTERFACE_NODE, &isis_hello_multiplier_l2_cmd);
2806: install_element (INTERFACE_NODE, &no_isis_hello_multiplier_l2_cmd);
2807: install_element (INTERFACE_NODE, &no_isis_hello_multiplier_l2_arg_cmd);
2808:
1.1.1.2 misho 2809: install_element (INTERFACE_NODE, &isis_hello_padding_cmd);
2810: install_element (INTERFACE_NODE, &no_isis_hello_padding_cmd);
2811:
1.1 misho 2812: install_element (INTERFACE_NODE, &csnp_interval_cmd);
2813: install_element (INTERFACE_NODE, &no_csnp_interval_cmd);
2814: install_element (INTERFACE_NODE, &no_csnp_interval_arg_cmd);
2815: install_element (INTERFACE_NODE, &csnp_interval_l1_cmd);
2816: install_element (INTERFACE_NODE, &no_csnp_interval_l1_cmd);
2817: install_element (INTERFACE_NODE, &no_csnp_interval_l1_arg_cmd);
2818: install_element (INTERFACE_NODE, &csnp_interval_l2_cmd);
2819: install_element (INTERFACE_NODE, &no_csnp_interval_l2_cmd);
2820: install_element (INTERFACE_NODE, &no_csnp_interval_l2_arg_cmd);
2821:
1.1.1.2 misho 2822: install_element (INTERFACE_NODE, &psnp_interval_cmd);
2823: install_element (INTERFACE_NODE, &no_psnp_interval_cmd);
2824: install_element (INTERFACE_NODE, &no_psnp_interval_arg_cmd);
2825: install_element (INTERFACE_NODE, &psnp_interval_l1_cmd);
2826: install_element (INTERFACE_NODE, &no_psnp_interval_l1_cmd);
2827: install_element (INTERFACE_NODE, &no_psnp_interval_l1_arg_cmd);
2828: install_element (INTERFACE_NODE, &psnp_interval_l2_cmd);
2829: install_element (INTERFACE_NODE, &no_psnp_interval_l2_cmd);
2830: install_element (INTERFACE_NODE, &no_psnp_interval_l2_arg_cmd);
2831:
2832: install_element (INTERFACE_NODE, &isis_network_cmd);
2833: install_element (INTERFACE_NODE, &no_isis_network_cmd);
2834:
1.1 misho 2835: #ifdef HAVE_IPV6
2836: install_element (INTERFACE_NODE, &ipv6_router_isis_cmd);
2837: install_element (INTERFACE_NODE, &no_ipv6_router_isis_cmd);
2838: #endif
2839: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>