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