Annotation of embedaddon/quagga/isisd/isis_circuit.c, revision 1.1
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"
! 47: #include "isisd/isis_circuit.h"
! 48: #include "isisd/isis_tlv.h"
! 49: #include "isisd/isis_lsp.h"
! 50: #include "isisd/isis_pdu.h"
! 51: #include "isisd/isis_network.h"
! 52: #include "isisd/isis_misc.h"
! 53: #include "isisd/isis_constants.h"
! 54: #include "isisd/isis_adjacency.h"
! 55: #include "isisd/isis_dr.h"
! 56: #include "isisd/isis_flags.h"
! 57: #include "isisd/isisd.h"
! 58: #include "isisd/isis_csm.h"
! 59: #include "isisd/isis_events.h"
! 60:
! 61: extern struct thread_master *master;
! 62: extern struct isis *isis;
! 63:
! 64: /*
! 65: * Prototypes.
! 66: */
! 67: void isis_circuit_down(struct isis_circuit *);
! 68: int isis_interface_config_write(struct vty *);
! 69: int isis_if_new_hook(struct interface *);
! 70: int isis_if_delete_hook(struct interface *);
! 71:
! 72: struct isis_circuit *
! 73: isis_circuit_new ()
! 74: {
! 75: struct isis_circuit *circuit;
! 76: int i;
! 77:
! 78: circuit = XCALLOC (MTYPE_ISIS_CIRCUIT, sizeof (struct isis_circuit));
! 79: if (circuit)
! 80: {
! 81: /* set default metrics for circuit */
! 82: for (i = 0; i < 2; i++)
! 83: {
! 84: circuit->metrics[i].metric_default = DEFAULT_CIRCUIT_METRICS;
! 85: circuit->metrics[i].metric_expense = METRICS_UNSUPPORTED;
! 86: circuit->metrics[i].metric_error = METRICS_UNSUPPORTED;
! 87: circuit->metrics[i].metric_delay = METRICS_UNSUPPORTED;
! 88: circuit->te_metric[i] = DEFAULT_CIRCUIT_METRICS;
! 89: }
! 90: }
! 91: else
! 92: {
! 93: zlog_err ("Can't malloc isis circuit");
! 94: return NULL;
! 95: }
! 96:
! 97: return circuit;
! 98: }
! 99:
! 100: void
! 101: isis_circuit_configure (struct isis_circuit *circuit, struct isis_area *area)
! 102: {
! 103: int i;
! 104: circuit->area = area;
! 105: /*
! 106: * The level for the circuit is same as for the area, unless configured
! 107: * otherwise.
! 108: */
! 109: circuit->circuit_is_type = area->is_type;
! 110: /*
! 111: * Default values
! 112: */
! 113: for (i = 0; i < 2; i++)
! 114: {
! 115: circuit->hello_interval[i] = HELLO_INTERVAL;
! 116: circuit->hello_multiplier[i] = HELLO_MULTIPLIER;
! 117: circuit->csnp_interval[i] = CSNP_INTERVAL;
! 118: circuit->psnp_interval[i] = PSNP_INTERVAL;
! 119: circuit->u.bc.priority[i] = DEFAULT_PRIORITY;
! 120: }
! 121: if (circuit->circ_type == CIRCUIT_T_BROADCAST)
! 122: {
! 123: circuit->u.bc.adjdb[0] = list_new ();
! 124: circuit->u.bc.adjdb[1] = list_new ();
! 125: circuit->u.bc.pad_hellos = 1;
! 126: }
! 127: circuit->lsp_interval = LSP_INTERVAL;
! 128:
! 129: /*
! 130: * Add the circuit into area
! 131: */
! 132: listnode_add (area->circuit_list, circuit);
! 133:
! 134: circuit->idx = flags_get_index (&area->flags);
! 135: circuit->lsp_queue = list_new ();
! 136:
! 137: return;
! 138: }
! 139:
! 140: void
! 141: isis_circuit_deconfigure (struct isis_circuit *circuit,
! 142: struct isis_area *area)
! 143: {
! 144:
! 145: /* destroy adjacencies */
! 146: if (circuit->u.bc.adjdb[0])
! 147: isis_adjdb_iterate (circuit->u.bc.adjdb[0], (void(*) (struct isis_adjacency *, void *)) isis_delete_adj, circuit->u.bc.adjdb[0]);
! 148: if (circuit->u.bc.adjdb[1])
! 149: isis_adjdb_iterate (circuit->u.bc.adjdb[1], (void(*) (struct isis_adjacency *, void *)) isis_delete_adj, circuit->u.bc.adjdb[1]);
! 150: /* Remove circuit from area */
! 151: listnode_delete (area->circuit_list, circuit);
! 152: /* Free the index of SRM and SSN flags */
! 153: flags_free_index (&area->flags, circuit->idx);
! 154:
! 155: return;
! 156: }
! 157:
! 158: struct isis_circuit *
! 159: circuit_lookup_by_ifp (struct interface *ifp, struct list *list)
! 160: {
! 161: struct isis_circuit *circuit = NULL;
! 162: struct listnode *node;
! 163:
! 164: if (!list)
! 165: return NULL;
! 166:
! 167: for (ALL_LIST_ELEMENTS_RO (list, node, circuit))
! 168: if (circuit->interface == ifp)
! 169: return circuit;
! 170:
! 171: return NULL;
! 172: }
! 173:
! 174: struct isis_circuit *
! 175: circuit_scan_by_ifp (struct interface *ifp)
! 176: {
! 177: struct isis_area *area;
! 178: struct listnode *node;
! 179: struct isis_circuit *circuit;
! 180:
! 181: if (!isis->area_list)
! 182: return NULL;
! 183:
! 184: for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
! 185: {
! 186: circuit = circuit_lookup_by_ifp (ifp, area->circuit_list);
! 187: if (circuit)
! 188: return circuit;
! 189: }
! 190:
! 191: return circuit_lookup_by_ifp (ifp, isis->init_circ_list);
! 192: }
! 193:
! 194: void
! 195: isis_circuit_del (struct isis_circuit *circuit)
! 196: {
! 197:
! 198: if (!circuit)
! 199: return;
! 200:
! 201: if (circuit->circ_type == CIRCUIT_T_BROADCAST)
! 202: {
! 203: /* destroy adjacency databases */
! 204: if (circuit->u.bc.adjdb[0])
! 205: list_delete (circuit->u.bc.adjdb[0]);
! 206: if (circuit->u.bc.adjdb[1])
! 207: list_delete (circuit->u.bc.adjdb[1]);
! 208: /* destroy neighbour lists */
! 209: if (circuit->u.bc.lan_neighs[0])
! 210: list_delete (circuit->u.bc.lan_neighs[0]);
! 211: if (circuit->u.bc.lan_neighs[1])
! 212: list_delete (circuit->u.bc.lan_neighs[1]);
! 213: /* destroy addresses */
! 214: }
! 215: if (circuit->ip_addrs)
! 216: list_delete (circuit->ip_addrs);
! 217: #ifdef HAVE_IPV6
! 218: if (circuit->ipv6_link)
! 219: list_delete (circuit->ipv6_link);
! 220: if (circuit->ipv6_non_link)
! 221: list_delete (circuit->ipv6_non_link);
! 222: #endif /* HAVE_IPV6 */
! 223:
! 224: /* and lastly the circuit itself */
! 225: XFREE (MTYPE_ISIS_CIRCUIT, circuit);
! 226:
! 227: return;
! 228: }
! 229:
! 230: void
! 231: isis_circuit_add_addr (struct isis_circuit *circuit,
! 232: struct connected *connected)
! 233: {
! 234: struct prefix_ipv4 *ipv4;
! 235: u_char buf[BUFSIZ];
! 236: #ifdef HAVE_IPV6
! 237: struct prefix_ipv6 *ipv6;
! 238: #endif /* HAVE_IPV6 */
! 239:
! 240: if (!circuit->ip_addrs)
! 241: circuit->ip_addrs = list_new ();
! 242: #ifdef HAVE_IPV6
! 243: if (!circuit->ipv6_link)
! 244: circuit->ipv6_link = list_new ();
! 245: if (!circuit->ipv6_non_link)
! 246: circuit->ipv6_non_link = list_new ();
! 247: #endif /* HAVE_IPV6 */
! 248:
! 249: memset (&buf, 0, BUFSIZ);
! 250: if (connected->address->family == AF_INET)
! 251: {
! 252: ipv4 = prefix_ipv4_new ();
! 253: ipv4->prefixlen = connected->address->prefixlen;
! 254: ipv4->prefix = connected->address->u.prefix4;
! 255: listnode_add (circuit->ip_addrs, ipv4);
! 256: if (circuit->area)
! 257: lsp_regenerate_schedule (circuit->area);
! 258:
! 259: #ifdef EXTREME_DEBUG
! 260: prefix2str (connected->address, buf, BUFSIZ);
! 261: zlog_debug ("Added IP address %s to circuit %d", buf,
! 262: circuit->circuit_id);
! 263: #endif /* EXTREME_DEBUG */
! 264: }
! 265: #ifdef HAVE_IPV6
! 266: if (connected->address->family == AF_INET6)
! 267: {
! 268: ipv6 = prefix_ipv6_new ();
! 269: ipv6->prefixlen = connected->address->prefixlen;
! 270: ipv6->prefix = connected->address->u.prefix6;
! 271:
! 272: if (IN6_IS_ADDR_LINKLOCAL (&ipv6->prefix))
! 273: listnode_add (circuit->ipv6_link, ipv6);
! 274: else
! 275: listnode_add (circuit->ipv6_non_link, ipv6);
! 276: if (circuit->area)
! 277: lsp_regenerate_schedule (circuit->area);
! 278:
! 279: #ifdef EXTREME_DEBUG
! 280: prefix2str (connected->address, buf, BUFSIZ);
! 281: zlog_debug ("Added IPv6 address %s to circuit %d", buf,
! 282: circuit->circuit_id);
! 283: #endif /* EXTREME_DEBUG */
! 284: }
! 285: #endif /* HAVE_IPV6 */
! 286: return;
! 287: }
! 288:
! 289: void
! 290: isis_circuit_del_addr (struct isis_circuit *circuit,
! 291: struct connected *connected)
! 292: {
! 293: struct prefix_ipv4 *ipv4, *ip = NULL;
! 294: struct listnode *node;
! 295: u_char buf[BUFSIZ];
! 296: #ifdef HAVE_IPV6
! 297: struct prefix_ipv6 *ipv6, *ip6 = NULL;
! 298: int found = 0;
! 299: #endif /* HAVE_IPV6 */
! 300:
! 301: memset (&buf, 0, BUFSIZ);
! 302: if (connected->address->family == AF_INET)
! 303: {
! 304: ipv4 = prefix_ipv4_new ();
! 305: ipv4->prefixlen = connected->address->prefixlen;
! 306: ipv4->prefix = connected->address->u.prefix4;
! 307:
! 308: for (ALL_LIST_ELEMENTS_RO (circuit->ip_addrs, node, ip))
! 309: if (prefix_same ((struct prefix *) ip, (struct prefix *) &ipv4))
! 310: break;
! 311:
! 312: if (ip)
! 313: {
! 314: listnode_delete (circuit->ip_addrs, ip);
! 315: if (circuit->area)
! 316: lsp_regenerate_schedule (circuit->area);
! 317: }
! 318: else
! 319: {
! 320: prefix2str (connected->address, (char *)buf, BUFSIZ);
! 321: zlog_warn("Nonexitant ip address %s removal attempt from circuit \
! 322: %d", buf, circuit->circuit_id);
! 323: }
! 324: }
! 325: #ifdef HAVE_IPV6
! 326: if (connected->address->family == AF_INET6)
! 327: {
! 328: ipv6 = prefix_ipv6_new ();
! 329: ipv6->prefixlen = connected->address->prefixlen;
! 330: ipv6->prefix = connected->address->u.prefix6;
! 331:
! 332: if (IN6_IS_ADDR_LINKLOCAL (&ipv6->prefix))
! 333: {
! 334: for (ALL_LIST_ELEMENTS_RO (circuit->ipv6_link, node, ip6))
! 335: {
! 336: if (prefix_same ((struct prefix *) ip6, (struct prefix *) ipv6))
! 337: break;
! 338: }
! 339: if (ip6)
! 340: {
! 341: listnode_delete (circuit->ipv6_link, ip6);
! 342: found = 1;
! 343: }
! 344: }
! 345: else
! 346: {
! 347: for (ALL_LIST_ELEMENTS_RO (circuit->ipv6_non_link, node, ip6))
! 348: {
! 349: if (prefix_same ((struct prefix *) ip6, (struct prefix *) ipv6))
! 350: break;
! 351: }
! 352: if (ip6)
! 353: {
! 354: listnode_delete (circuit->ipv6_non_link, ip6);
! 355: found = 1;
! 356: }
! 357: }
! 358:
! 359: if (!found)
! 360: {
! 361: prefix2str (connected->address, (char *)buf, BUFSIZ);
! 362: zlog_warn("Nonexitant ip address %s removal attempt from \
! 363: circuit %d", buf, circuit->circuit_id);
! 364: }
! 365: else
! 366: if (circuit->area)
! 367: lsp_regenerate_schedule (circuit->area);
! 368: }
! 369: #endif /* HAVE_IPV6 */
! 370: return;
! 371: }
! 372:
! 373: void
! 374: isis_circuit_if_add (struct isis_circuit *circuit, struct interface *ifp)
! 375: {
! 376: struct listnode *node, *nnode;
! 377: struct connected *conn;
! 378:
! 379: circuit->interface = ifp;
! 380: ifp->info = circuit;
! 381:
! 382: circuit->circuit_id = ifp->ifindex % 255; /* FIXME: Why not ? */
! 383:
! 384: /* isis_circuit_update_addrs (circuit, ifp); */
! 385:
! 386: if (if_is_broadcast (ifp))
! 387: {
! 388: circuit->circ_type = CIRCUIT_T_BROADCAST;
! 389: /*
! 390: * Get the Hardware Address
! 391: */
! 392: #ifdef HAVE_STRUCT_SOCKADDR_DL
! 393: #ifndef SUNOS_5
! 394: if (circuit->interface->sdl.sdl_alen != ETHER_ADDR_LEN)
! 395: zlog_warn ("unsupported link layer");
! 396: else
! 397: memcpy (circuit->u.bc.snpa, LLADDR (&circuit->interface->sdl),
! 398: ETH_ALEN);
! 399: #endif
! 400: #else
! 401: if (circuit->interface->hw_addr_len != ETH_ALEN)
! 402: {
! 403: zlog_warn ("unsupported link layer");
! 404: }
! 405: else
! 406: {
! 407: memcpy (circuit->u.bc.snpa, circuit->interface->hw_addr, ETH_ALEN);
! 408: }
! 409: #ifdef EXTREME_DEGUG
! 410: zlog_debug ("isis_circuit_if_add: if_id %d, isomtu %d snpa %s",
! 411: circuit->interface->ifindex, ISO_MTU (circuit),
! 412: snpa_print (circuit->u.bc.snpa));
! 413:
! 414: #endif /* EXTREME_DEBUG */
! 415: #endif /* HAVE_STRUCT_SOCKADDR_DL */
! 416: }
! 417: else if (if_is_pointopoint (ifp))
! 418: {
! 419: circuit->circ_type = CIRCUIT_T_P2P;
! 420: }
! 421: else
! 422: {
! 423: /* It's normal in case of loopback etc. */
! 424: if (isis->debugs & DEBUG_EVENTS)
! 425: zlog_debug ("isis_circuit_if_add: unsupported media");
! 426: }
! 427:
! 428: for (ALL_LIST_ELEMENTS (ifp->connected, node, nnode, conn))
! 429: isis_circuit_add_addr (circuit, conn);
! 430:
! 431: return;
! 432: }
! 433:
! 434: void
! 435: isis_circuit_update_params (struct isis_circuit *circuit,
! 436: struct interface *ifp)
! 437: {
! 438: assert (circuit);
! 439:
! 440: if (circuit->circuit_id != ifp->ifindex)
! 441: {
! 442: zlog_warn ("changing circuit_id %d->%d", circuit->circuit_id,
! 443: ifp->ifindex);
! 444: circuit->circuit_id = ifp->ifindex % 255;
! 445: }
! 446:
! 447: /* FIXME: Why is this needed? shouldn't we compare to the area's mtu */
! 448: /* Ofer, this was here in case someone changes the mtu (e.g. with ifconfig)
! 449: The areas MTU is the minimum of mtu's of circuits in the area
! 450: now we can't catch the change
! 451: if (circuit->mtu != ifp->mtu) {
! 452: zlog_warn ("changing circuit mtu %d->%d", circuit->mtu,
! 453: ifp->mtu);
! 454: circuit->mtu = ifp->mtu;
! 455: }
! 456: */
! 457: /*
! 458: * Get the Hardware Address
! 459: */
! 460: #ifdef HAVE_STRUCT_SOCKADDR_DL
! 461: #ifndef SUNOS_5
! 462: if (circuit->interface->sdl.sdl_alen != ETHER_ADDR_LEN)
! 463: zlog_warn ("unsupported link layer");
! 464: else
! 465: memcpy (circuit->u.bc.snpa, LLADDR (&circuit->interface->sdl), ETH_ALEN);
! 466: #endif
! 467: #else
! 468: if (circuit->interface->hw_addr_len != ETH_ALEN)
! 469: {
! 470: zlog_warn ("unsupported link layer");
! 471: }
! 472: else
! 473: {
! 474: if (memcmp (circuit->u.bc.snpa, circuit->interface->hw_addr, ETH_ALEN))
! 475: {
! 476: zlog_warn ("changing circuit snpa %s->%s",
! 477: snpa_print (circuit->u.bc.snpa),
! 478: snpa_print (circuit->interface->hw_addr));
! 479: }
! 480: }
! 481: #endif
! 482:
! 483: if (if_is_broadcast (ifp))
! 484: {
! 485: circuit->circ_type = CIRCUIT_T_BROADCAST;
! 486: }
! 487: else if (if_is_pointopoint (ifp))
! 488: {
! 489: circuit->circ_type = CIRCUIT_T_P2P;
! 490: }
! 491: else
! 492: {
! 493: zlog_warn ("isis_circuit_update_params: unsupported media");
! 494: }
! 495:
! 496: return;
! 497: }
! 498:
! 499: void
! 500: isis_circuit_if_del (struct isis_circuit *circuit)
! 501: {
! 502: circuit->interface->info = NULL;
! 503: circuit->interface = NULL;
! 504:
! 505: return;
! 506: }
! 507:
! 508: void
! 509: isis_circuit_up (struct isis_circuit *circuit)
! 510: {
! 511:
! 512: if (circuit->circ_type == CIRCUIT_T_BROADCAST)
! 513: {
! 514: if (circuit->area->min_bcast_mtu == 0 ||
! 515: ISO_MTU (circuit) < circuit->area->min_bcast_mtu)
! 516: circuit->area->min_bcast_mtu = ISO_MTU (circuit);
! 517: /*
! 518: * ISO 10589 - 8.4.1 Enabling of broadcast circuits
! 519: */
! 520:
! 521: /* initilizing the hello sending threads
! 522: * for a broadcast IF
! 523: */
! 524:
! 525: /* 8.4.1 a) commence sending of IIH PDUs */
! 526:
! 527: if (circuit->circuit_is_type & IS_LEVEL_1)
! 528: {
! 529: thread_add_event (master, send_lan_l1_hello, circuit, 0);
! 530: circuit->u.bc.lan_neighs[0] = list_new ();
! 531: }
! 532:
! 533: if (circuit->circuit_is_type & IS_LEVEL_2)
! 534: {
! 535: thread_add_event (master, send_lan_l2_hello, circuit, 0);
! 536: circuit->u.bc.lan_neighs[1] = list_new ();
! 537: }
! 538:
! 539: /* 8.4.1 b) FIXME: solicit ES - 8.4.6 */
! 540: /* 8.4.1 c) FIXME: listen for ESH PDUs */
! 541:
! 542: /* 8.4.1 d) */
! 543: /* dr election will commence in... */
! 544: if (circuit->circuit_is_type & IS_LEVEL_1)
! 545: THREAD_TIMER_ON (master, circuit->u.bc.t_run_dr[0], isis_run_dr_l1,
! 546: circuit, 2 * circuit->hello_interval[0]);
! 547: if (circuit->circuit_is_type & IS_LEVEL_2)
! 548: THREAD_TIMER_ON (master, circuit->u.bc.t_run_dr[1], isis_run_dr_l2,
! 549: circuit, 2 * circuit->hello_interval[1]);
! 550: }
! 551: else
! 552: {
! 553: /* initializing the hello send threads
! 554: * for a ptp IF
! 555: */
! 556: thread_add_event (master, send_p2p_hello, circuit, 0);
! 557:
! 558: }
! 559:
! 560: /* initializing PSNP timers */
! 561: if (circuit->circuit_is_type & IS_LEVEL_1)
! 562: {
! 563: THREAD_TIMER_ON (master, circuit->t_send_psnp[0], send_l1_psnp, circuit,
! 564: isis_jitter (circuit->psnp_interval[0], PSNP_JITTER));
! 565: }
! 566:
! 567: if (circuit->circuit_is_type & IS_LEVEL_2)
! 568: {
! 569: THREAD_TIMER_ON (master, circuit->t_send_psnp[1], send_l2_psnp, circuit,
! 570: isis_jitter (circuit->psnp_interval[1], PSNP_JITTER));
! 571: }
! 572:
! 573: /* initialize the circuit streams */
! 574: if (circuit->rcv_stream == NULL)
! 575: circuit->rcv_stream = stream_new (ISO_MTU (circuit));
! 576:
! 577: if (circuit->snd_stream == NULL)
! 578: circuit->snd_stream = stream_new (ISO_MTU (circuit));
! 579:
! 580: /* unified init for circuits */
! 581: isis_sock_init (circuit);
! 582:
! 583: #ifdef GNU_LINUX
! 584: THREAD_READ_ON (master, circuit->t_read, isis_receive, circuit,
! 585: circuit->fd);
! 586: #else
! 587: THREAD_TIMER_ON (master, circuit->t_read, isis_receive, circuit,
! 588: circuit->fd);
! 589: #endif
! 590: return;
! 591: }
! 592:
! 593: void
! 594: isis_circuit_down (struct isis_circuit *circuit)
! 595: {
! 596: /* Cancel all active threads -- FIXME: wrong place */
! 597: /* HT: Read thread if GNU_LINUX, TIMER thread otherwise. */
! 598: THREAD_OFF (circuit->t_read);
! 599: if (circuit->circ_type == CIRCUIT_T_BROADCAST)
! 600: {
! 601: THREAD_TIMER_OFF (circuit->u.bc.t_send_lan_hello[0]);
! 602: THREAD_TIMER_OFF (circuit->u.bc.t_send_lan_hello[1]);
! 603: THREAD_TIMER_OFF (circuit->u.bc.t_run_dr[0]);
! 604: THREAD_TIMER_OFF (circuit->u.bc.t_run_dr[1]);
! 605: }
! 606: else if (circuit->circ_type == CIRCUIT_T_P2P)
! 607: {
! 608: THREAD_TIMER_OFF (circuit->u.p2p.t_send_p2p_hello);
! 609: }
! 610:
! 611: if (circuit->t_send_psnp[0]) {
! 612: THREAD_TIMER_OFF (circuit->t_send_psnp[0]);
! 613: }
! 614: if (circuit->t_send_psnp[1]) {
! 615: THREAD_TIMER_OFF (circuit->t_send_psnp[1]);
! 616: }
! 617: /* close the socket */
! 618: close (circuit->fd);
! 619:
! 620: return;
! 621: }
! 622:
! 623: void
! 624: circuit_update_nlpids (struct isis_circuit *circuit)
! 625: {
! 626: circuit->nlpids.count = 0;
! 627:
! 628: if (circuit->ip_router)
! 629: {
! 630: circuit->nlpids.nlpids[0] = NLPID_IP;
! 631: circuit->nlpids.count++;
! 632: }
! 633: #ifdef HAVE_IPV6
! 634: if (circuit->ipv6_router)
! 635: {
! 636: circuit->nlpids.nlpids[circuit->nlpids.count] = NLPID_IPV6;
! 637: circuit->nlpids.count++;
! 638: }
! 639: #endif /* HAVE_IPV6 */
! 640: return;
! 641: }
! 642:
! 643: int
! 644: isis_interface_config_write (struct vty *vty)
! 645: {
! 646:
! 647: int write = 0;
! 648: struct listnode *node, *node2;
! 649: struct interface *ifp;
! 650: struct isis_area *area;
! 651: struct isis_circuit *c;
! 652: int i;
! 653:
! 654: for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
! 655: {
! 656: /* IF name */
! 657: vty_out (vty, "interface %s%s", ifp->name, VTY_NEWLINE);
! 658: write++;
! 659: /* IF desc */
! 660: if (ifp->desc)
! 661: {
! 662: vty_out (vty, " description %s%s", ifp->desc, VTY_NEWLINE);
! 663: write++;
! 664: }
! 665: /* ISIS Circuit */
! 666: for (ALL_LIST_ELEMENTS_RO (isis->area_list, node2, area))
! 667: {
! 668: c = circuit_lookup_by_ifp (ifp, area->circuit_list);
! 669: if (c)
! 670: {
! 671: if (c->ip_router)
! 672: {
! 673: vty_out (vty, " ip router isis %s%s", area->area_tag,
! 674: VTY_NEWLINE);
! 675: write++;
! 676: }
! 677: #ifdef HAVE_IPV6
! 678: if (c->ipv6_router)
! 679: {
! 680: vty_out (vty, " ipv6 router isis %s%s", area->area_tag,
! 681: VTY_NEWLINE);
! 682: write++;
! 683: }
! 684: #endif /* HAVE_IPV6 */
! 685:
! 686: /* ISIS - circuit type */
! 687: if (c->circuit_is_type == IS_LEVEL_1)
! 688: {
! 689: vty_out (vty, " isis circuit-type level-1%s", VTY_NEWLINE);
! 690: write++;
! 691: }
! 692: else
! 693: {
! 694: if (c->circuit_is_type == IS_LEVEL_2)
! 695: {
! 696: vty_out (vty, " isis circuit-type level-2-only%s",
! 697: VTY_NEWLINE);
! 698: write++;
! 699: }
! 700: }
! 701:
! 702: /* ISIS - CSNP interval - FIXME: compare to cisco */
! 703: if (c->csnp_interval[0] == c->csnp_interval[1])
! 704: {
! 705: if (c->csnp_interval[0] != CSNP_INTERVAL)
! 706: {
! 707: vty_out (vty, " isis csnp-interval %d%s",
! 708: c->csnp_interval[0], VTY_NEWLINE);
! 709: write++;
! 710: }
! 711: }
! 712: else
! 713: {
! 714: for (i = 0; i < 2; i++)
! 715: {
! 716: if (c->csnp_interval[1] != CSNP_INTERVAL)
! 717: {
! 718: vty_out (vty, " isis csnp-interval %d level-%d%s",
! 719: c->csnp_interval[1], i + 1, VTY_NEWLINE);
! 720: write++;
! 721: }
! 722: }
! 723: }
! 724:
! 725: /* ISIS - Hello padding - Defaults to true so only display if false */
! 726: if (c->circ_type == CIRCUIT_T_BROADCAST && !c->u.bc.pad_hellos)
! 727: {
! 728: vty_out (vty, " no isis hello padding%s", VTY_NEWLINE);
! 729: write++;
! 730: }
! 731:
! 732: /* ISIS - Hello interval - FIXME: compare to cisco */
! 733: if (c->hello_interval[0] == c->hello_interval[1])
! 734: {
! 735: if (c->hello_interval[0] != HELLO_INTERVAL)
! 736: {
! 737: vty_out (vty, " isis hello-interval %d%s",
! 738: c->hello_interval[0], VTY_NEWLINE);
! 739: write++;
! 740: }
! 741: }
! 742: else
! 743: {
! 744: for (i = 0; i < 2; i++)
! 745: {
! 746: if (c->hello_interval[i] != HELLO_INTERVAL)
! 747: {
! 748: if (c->hello_interval[i] == HELLO_MINIMAL)
! 749: {
! 750: vty_out (vty,
! 751: " isis hello-interval minimal level-%d%s",
! 752: i + 1, VTY_NEWLINE);
! 753: }
! 754: else
! 755: {
! 756: vty_out (vty, " isis hello-interval %d level-%d%s",
! 757: c->hello_interval[i], i + 1, VTY_NEWLINE);
! 758: }
! 759: write++;
! 760: }
! 761: }
! 762: }
! 763:
! 764: /* ISIS - Hello Multiplier */
! 765: if (c->hello_multiplier[0] == c->hello_multiplier[1])
! 766: {
! 767: if (c->hello_multiplier[0] != HELLO_MULTIPLIER)
! 768: {
! 769: vty_out (vty, " isis hello-multiplier %d%s",
! 770: c->hello_multiplier[0], VTY_NEWLINE);
! 771: write++;
! 772: }
! 773: }
! 774: else
! 775: {
! 776: for (i = 0; i < 2; i++)
! 777: {
! 778: if (c->hello_multiplier[i] != HELLO_MULTIPLIER)
! 779: {
! 780: vty_out (vty, " isis hello-multiplier %d level-%d%s",
! 781: c->hello_multiplier[i], i + 1, VTY_NEWLINE);
! 782: write++;
! 783: }
! 784: }
! 785: }
! 786: /* ISIS - Priority */
! 787: if (c->circ_type == CIRCUIT_T_BROADCAST)
! 788: {
! 789: if (c->u.bc.priority[0] == c->u.bc.priority[1])
! 790: {
! 791: if (c->u.bc.priority[0] != DEFAULT_PRIORITY)
! 792: {
! 793: vty_out (vty, " isis priority %d%s",
! 794: c->u.bc.priority[0], VTY_NEWLINE);
! 795: write++;
! 796: }
! 797: }
! 798: else
! 799: {
! 800: for (i = 0; i < 2; i++)
! 801: {
! 802: if (c->u.bc.priority[i] != DEFAULT_PRIORITY)
! 803: {
! 804: vty_out (vty, " isis priority %d level-%d%s",
! 805: c->u.bc.priority[i], i + 1, VTY_NEWLINE);
! 806: write++;
! 807: }
! 808: }
! 809: }
! 810: }
! 811: /* ISIS - Metric */
! 812: if (c->te_metric[0] == c->te_metric[1])
! 813: {
! 814: if (c->te_metric[0] != DEFAULT_CIRCUIT_METRICS)
! 815: {
! 816: vty_out (vty, " isis metric %d%s", c->te_metric[0],
! 817: VTY_NEWLINE);
! 818: write++;
! 819: }
! 820: }
! 821: else
! 822: {
! 823: for (i = 0; i < 2; i++)
! 824: {
! 825: if (c->te_metric[i] != DEFAULT_CIRCUIT_METRICS)
! 826: {
! 827: vty_out (vty, " isis metric %d level-%d%s",
! 828: c->te_metric[i], i + 1, VTY_NEWLINE);
! 829: write++;
! 830: }
! 831: }
! 832: }
! 833:
! 834: }
! 835: }
! 836: vty_out (vty, "!%s", VTY_NEWLINE);
! 837: }
! 838:
! 839: return write;
! 840: }
! 841:
! 842: DEFUN (ip_router_isis,
! 843: ip_router_isis_cmd,
! 844: "ip router isis WORD",
! 845: "Interface Internet Protocol config commands\n"
! 846: "IP router interface commands\n"
! 847: "IS-IS Routing for IP\n"
! 848: "Routing process tag\n")
! 849: {
! 850: struct isis_circuit *c;
! 851: struct interface *ifp;
! 852: struct isis_area *area;
! 853:
! 854: ifp = (struct interface *) vty->index;
! 855: assert (ifp);
! 856:
! 857: area = isis_area_lookup (argv[0]);
! 858:
! 859: /* Prevent more than one circuit per interface */
! 860: if (area)
! 861: c = circuit_lookup_by_ifp (ifp, area->circuit_list);
! 862: else
! 863: c = NULL;
! 864: if (c && (ifp->info != NULL))
! 865: {
! 866: #ifdef HAVE_IPV6
! 867: if (c->ipv6_router == 0)
! 868: {
! 869: #endif /* HAVE_IPV6 */
! 870: /* FIXME: Find the way to warn only vty users. */
! 871: /* vty_out (vty, "ISIS circuit is already defined%s", VTY_NEWLINE); */
! 872: return CMD_WARNING;
! 873: #ifdef HAVE_IPV6
! 874: }
! 875: #endif /* HAVE_IPV6 */
! 876: }
! 877:
! 878: /* this is here for ciscopability */
! 879: if (!area)
! 880: {
! 881: /* FIXME: Find the way to warn only vty users. */
! 882: /* vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE); */
! 883: return CMD_WARNING;
! 884: }
! 885:
! 886: if (!c)
! 887: {
! 888: c = circuit_lookup_by_ifp (ifp, isis->init_circ_list);
! 889: c = isis_csm_state_change (ISIS_ENABLE, c, area);
! 890: c->interface = ifp; /* this is automatic */
! 891: ifp->info = c; /* hardly related to the FSM */
! 892: }
! 893:
! 894: if (!c)
! 895: return CMD_WARNING;
! 896:
! 897: c->ip_router = 1;
! 898: area->ip_circuits++;
! 899: circuit_update_nlpids (c);
! 900:
! 901: vty->node = INTERFACE_NODE;
! 902:
! 903: return CMD_SUCCESS;
! 904: }
! 905:
! 906: DEFUN (no_ip_router_isis,
! 907: no_ip_router_isis_cmd,
! 908: "no ip router isis WORD",
! 909: NO_STR
! 910: "Interface Internet Protocol config commands\n"
! 911: "IP router interface commands\n"
! 912: "IS-IS Routing for IP\n"
! 913: "Routing process tag\n")
! 914: {
! 915: struct isis_circuit *circuit = NULL;
! 916: struct interface *ifp;
! 917: struct isis_area *area;
! 918: struct listnode *node;
! 919:
! 920: ifp = (struct interface *) vty->index;
! 921: assert (ifp);
! 922:
! 923: area = isis_area_lookup (argv[0]);
! 924: if (!area)
! 925: {
! 926: vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE);
! 927: return CMD_WARNING;
! 928: }
! 929: for (ALL_LIST_ELEMENTS_RO (area->circuit_list, node, circuit))
! 930: if (circuit->interface == ifp)
! 931: break;
! 932: if (!circuit)
! 933: {
! 934: vty_out (vty, "Can't find ISIS interface %s", VTY_NEWLINE);
! 935: return CMD_WARNING;
! 936: }
! 937: circuit->ip_router = 0;
! 938: area->ip_circuits--;
! 939: #ifdef HAVE_IPV6
! 940: if (circuit->ipv6_router == 0)
! 941: #endif
! 942: isis_csm_state_change (ISIS_DISABLE, circuit, area);
! 943:
! 944: return CMD_SUCCESS;
! 945: }
! 946:
! 947: DEFUN (isis_circuit_type,
! 948: isis_circuit_type_cmd,
! 949: "isis circuit-type (level-1|level-1-2|level-2-only)",
! 950: "IS-IS commands\n"
! 951: "Configure circuit type for interface\n"
! 952: "Level-1 only adjacencies are formed\n"
! 953: "Level-1-2 adjacencies are formed\n"
! 954: "Level-2 only adjacencies are formed\n")
! 955: {
! 956: struct isis_circuit *circuit;
! 957: struct interface *ifp;
! 958: int circuit_t;
! 959: int is_type;
! 960:
! 961: ifp = vty->index;
! 962: circuit = ifp->info;
! 963: /* UGLY - will remove l8r */
! 964: if (circuit == NULL)
! 965: {
! 966: return CMD_WARNING;
! 967: }
! 968:
! 969: /* XXX what to do when ip_router_isis is not executed */
! 970: if (circuit->area == NULL)
! 971: return CMD_WARNING;
! 972:
! 973: assert (circuit);
! 974:
! 975: circuit_t = string2circuit_t (argv[0]);
! 976:
! 977: if (!circuit_t)
! 978: {
! 979: vty_out (vty, "Unknown circuit-type %s", VTY_NEWLINE);
! 980: return CMD_SUCCESS;
! 981: }
! 982:
! 983: is_type = circuit->area->is_type;
! 984: if (is_type == IS_LEVEL_1_AND_2 || is_type == circuit_t)
! 985: isis_event_circuit_type_change (circuit, circuit_t);
! 986: else
! 987: {
! 988: vty_out (vty, "invalid circuit level for area %s.%s",
! 989: circuit->area->area_tag, VTY_NEWLINE);
! 990: }
! 991:
! 992: return CMD_SUCCESS;
! 993: }
! 994:
! 995: DEFUN (no_isis_circuit_type,
! 996: no_isis_circuit_type_cmd,
! 997: "no isis circuit-type (level-1|level-1-2|level-2-only)",
! 998: NO_STR
! 999: "IS-IS commands\n"
! 1000: "Configure circuit type for interface\n"
! 1001: "Level-1 only adjacencies are formed\n"
! 1002: "Level-1-2 adjacencies are formed\n"
! 1003: "Level-2 only adjacencies are formed\n")
! 1004: {
! 1005: struct isis_circuit *circuit;
! 1006: struct interface *ifp;
! 1007:
! 1008: ifp = vty->index;
! 1009: circuit = ifp->info;
! 1010: if (circuit == NULL)
! 1011: {
! 1012: return CMD_WARNING;
! 1013: }
! 1014:
! 1015: assert (circuit);
! 1016:
! 1017: /*
! 1018: * Set the circuits level to its default value which is that of the area
! 1019: */
! 1020: isis_event_circuit_type_change (circuit, circuit->area->is_type);
! 1021:
! 1022: return CMD_SUCCESS;
! 1023: }
! 1024:
! 1025: DEFUN (isis_passwd,
! 1026: isis_passwd_cmd,
! 1027: "isis password WORD",
! 1028: "IS-IS commands\n"
! 1029: "Configure the authentication password for interface\n"
! 1030: "Password\n")
! 1031: {
! 1032: struct isis_circuit *circuit;
! 1033: struct interface *ifp;
! 1034: int len;
! 1035:
! 1036: ifp = vty->index;
! 1037: circuit = ifp->info;
! 1038: if (circuit == NULL)
! 1039: {
! 1040: return CMD_WARNING;
! 1041: }
! 1042:
! 1043: len = strlen (argv[0]);
! 1044: if (len > 254)
! 1045: {
! 1046: vty_out (vty, "Too long circuit password (>254)%s", VTY_NEWLINE);
! 1047: return CMD_WARNING;
! 1048: }
! 1049: circuit->passwd.len = len;
! 1050: circuit->passwd.type = ISIS_PASSWD_TYPE_CLEARTXT;
! 1051: strncpy ((char *)circuit->passwd.passwd, argv[0], 255);
! 1052:
! 1053: return CMD_SUCCESS;
! 1054: }
! 1055:
! 1056: DEFUN (no_isis_passwd,
! 1057: no_isis_passwd_cmd,
! 1058: "no isis password",
! 1059: NO_STR
! 1060: "IS-IS commands\n"
! 1061: "Configure the authentication password for interface\n")
! 1062: {
! 1063: struct isis_circuit *circuit;
! 1064: struct interface *ifp;
! 1065:
! 1066: ifp = vty->index;
! 1067: circuit = ifp->info;
! 1068: if (circuit == NULL)
! 1069: {
! 1070: return CMD_WARNING;
! 1071: }
! 1072:
! 1073: memset (&circuit->passwd, 0, sizeof (struct isis_passwd));
! 1074:
! 1075: return CMD_SUCCESS;
! 1076: }
! 1077:
! 1078:
! 1079: DEFUN (isis_priority,
! 1080: isis_priority_cmd,
! 1081: "isis priority <0-127>",
! 1082: "IS-IS commands\n"
! 1083: "Set priority for Designated Router election\n"
! 1084: "Priority value\n")
! 1085: {
! 1086: struct isis_circuit *circuit;
! 1087: struct interface *ifp;
! 1088: int prio;
! 1089:
! 1090: ifp = vty->index;
! 1091: circuit = ifp->info;
! 1092: if (circuit == NULL)
! 1093: {
! 1094: return CMD_WARNING;
! 1095: }
! 1096: assert (circuit);
! 1097:
! 1098: prio = atoi (argv[0]);
! 1099:
! 1100: circuit->u.bc.priority[0] = prio;
! 1101: circuit->u.bc.priority[1] = prio;
! 1102:
! 1103: return CMD_SUCCESS;
! 1104: }
! 1105:
! 1106: DEFUN (no_isis_priority,
! 1107: no_isis_priority_cmd,
! 1108: "no isis priority",
! 1109: NO_STR
! 1110: "IS-IS commands\n"
! 1111: "Set priority for Designated Router election\n")
! 1112: {
! 1113: struct isis_circuit *circuit;
! 1114: struct interface *ifp;
! 1115:
! 1116: ifp = vty->index;
! 1117: circuit = ifp->info;
! 1118: if (circuit == NULL)
! 1119: {
! 1120: return CMD_WARNING;
! 1121: }
! 1122: assert (circuit);
! 1123:
! 1124: circuit->u.bc.priority[0] = DEFAULT_PRIORITY;
! 1125: circuit->u.bc.priority[1] = DEFAULT_PRIORITY;
! 1126:
! 1127: return CMD_SUCCESS;
! 1128: }
! 1129:
! 1130: ALIAS (no_isis_priority,
! 1131: no_isis_priority_arg_cmd,
! 1132: "no isis priority <0-127>",
! 1133: NO_STR
! 1134: "IS-IS commands\n"
! 1135: "Set priority for Designated Router election\n"
! 1136: "Priority value\n")
! 1137:
! 1138: DEFUN (isis_priority_l1,
! 1139: isis_priority_l1_cmd,
! 1140: "isis priority <0-127> level-1",
! 1141: "IS-IS commands\n"
! 1142: "Set priority for Designated Router election\n"
! 1143: "Priority value\n"
! 1144: "Specify priority for level-1 routing\n")
! 1145: {
! 1146: struct isis_circuit *circuit;
! 1147: struct interface *ifp;
! 1148: int prio;
! 1149:
! 1150: ifp = vty->index;
! 1151: circuit = ifp->info;
! 1152: if (circuit == NULL)
! 1153: {
! 1154: return CMD_WARNING;
! 1155: }
! 1156: assert (circuit);
! 1157:
! 1158: prio = atoi (argv[0]);
! 1159:
! 1160: circuit->u.bc.priority[0] = prio;
! 1161:
! 1162: return CMD_SUCCESS;
! 1163: }
! 1164:
! 1165: DEFUN (no_isis_priority_l1,
! 1166: no_isis_priority_l1_cmd,
! 1167: "no isis priority level-1",
! 1168: NO_STR
! 1169: "IS-IS commands\n"
! 1170: "Set priority for Designated Router election\n"
! 1171: "Specify priority for level-1 routing\n")
! 1172: {
! 1173: struct isis_circuit *circuit;
! 1174: struct interface *ifp;
! 1175:
! 1176: ifp = vty->index;
! 1177: circuit = ifp->info;
! 1178: if (circuit == NULL)
! 1179: {
! 1180: return CMD_WARNING;
! 1181: }
! 1182: assert (circuit);
! 1183:
! 1184: circuit->u.bc.priority[0] = DEFAULT_PRIORITY;
! 1185:
! 1186: return CMD_SUCCESS;
! 1187: }
! 1188:
! 1189: ALIAS (no_isis_priority_l1,
! 1190: no_isis_priority_l1_arg_cmd,
! 1191: "no isis priority <0-127> level-1",
! 1192: NO_STR
! 1193: "IS-IS commands\n"
! 1194: "Set priority for Designated Router election\n"
! 1195: "Priority value\n"
! 1196: "Specify priority for level-1 routing\n")
! 1197:
! 1198: DEFUN (isis_priority_l2,
! 1199: isis_priority_l2_cmd,
! 1200: "isis priority <0-127> level-2",
! 1201: "IS-IS commands\n"
! 1202: "Set priority for Designated Router election\n"
! 1203: "Priority value\n"
! 1204: "Specify priority for level-2 routing\n")
! 1205: {
! 1206: struct isis_circuit *circuit;
! 1207: struct interface *ifp;
! 1208: int prio;
! 1209:
! 1210: ifp = vty->index;
! 1211: circuit = ifp->info;
! 1212: if (circuit == NULL)
! 1213: {
! 1214: return CMD_WARNING;
! 1215: }
! 1216: assert (circuit);
! 1217:
! 1218: prio = atoi (argv[0]);
! 1219:
! 1220: circuit->u.bc.priority[1] = prio;
! 1221:
! 1222: return CMD_SUCCESS;
! 1223: }
! 1224:
! 1225: DEFUN (no_isis_priority_l2,
! 1226: no_isis_priority_l2_cmd,
! 1227: "no isis priority level-2",
! 1228: NO_STR
! 1229: "IS-IS commands\n"
! 1230: "Set priority for Designated Router election\n"
! 1231: "Specify priority for level-2 routing\n")
! 1232: {
! 1233: struct isis_circuit *circuit;
! 1234: struct interface *ifp;
! 1235:
! 1236: ifp = vty->index;
! 1237: circuit = ifp->info;
! 1238: if (circuit == NULL)
! 1239: {
! 1240: return CMD_WARNING;
! 1241: }
! 1242: assert (circuit);
! 1243:
! 1244: circuit->u.bc.priority[1] = DEFAULT_PRIORITY;
! 1245:
! 1246: return CMD_SUCCESS;
! 1247: }
! 1248:
! 1249: ALIAS (no_isis_priority_l2,
! 1250: no_isis_priority_l2_arg_cmd,
! 1251: "no isis priority <0-127> level-2",
! 1252: NO_STR
! 1253: "IS-IS commands\n"
! 1254: "Set priority for Designated Router election\n"
! 1255: "Priority value\n"
! 1256: "Specify priority for level-2 routing\n")
! 1257:
! 1258: /* Metric command */
! 1259: DEFUN (isis_metric,
! 1260: isis_metric_cmd,
! 1261: "isis metric <0-16777215>",
! 1262: "IS-IS commands\n"
! 1263: "Set default metric for circuit\n"
! 1264: "Default metric value\n")
! 1265: {
! 1266: struct isis_circuit *circuit;
! 1267: struct interface *ifp;
! 1268: int met;
! 1269:
! 1270: ifp = vty->index;
! 1271: circuit = ifp->info;
! 1272: if (circuit == NULL)
! 1273: {
! 1274: return CMD_WARNING;
! 1275: }
! 1276: assert (circuit);
! 1277:
! 1278: met = atoi (argv[0]);
! 1279:
! 1280: circuit->te_metric[0] = met;
! 1281: circuit->te_metric[1] = met;
! 1282:
! 1283: if (met > 63)
! 1284: met = 63;
! 1285:
! 1286: circuit->metrics[0].metric_default = met;
! 1287: circuit->metrics[1].metric_default = met;
! 1288:
! 1289: return CMD_SUCCESS;
! 1290: }
! 1291:
! 1292: DEFUN (no_isis_metric,
! 1293: no_isis_metric_cmd,
! 1294: "no isis metric",
! 1295: NO_STR
! 1296: "IS-IS commands\n"
! 1297: "Set default metric for circuit\n")
! 1298: {
! 1299: struct isis_circuit *circuit;
! 1300: struct interface *ifp;
! 1301:
! 1302: ifp = vty->index;
! 1303: circuit = ifp->info;
! 1304: if (circuit == NULL)
! 1305: {
! 1306: return CMD_WARNING;
! 1307: }
! 1308: assert (circuit);
! 1309:
! 1310: circuit->te_metric[0] = DEFAULT_CIRCUIT_METRICS;
! 1311: circuit->te_metric[1] = DEFAULT_CIRCUIT_METRICS;
! 1312: circuit->metrics[0].metric_default = DEFAULT_CIRCUIT_METRICS;
! 1313: circuit->metrics[1].metric_default = DEFAULT_CIRCUIT_METRICS;
! 1314:
! 1315: return CMD_SUCCESS;
! 1316: }
! 1317:
! 1318: ALIAS (no_isis_metric,
! 1319: no_isis_metric_arg_cmd,
! 1320: "no isis metric <0-16777215>",
! 1321: NO_STR
! 1322: "IS-IS commands\n"
! 1323: "Set default metric for circuit\n"
! 1324: "Default metric value\n")
! 1325:
! 1326: /* end of metrics */
! 1327: DEFUN (isis_hello_interval,
! 1328: isis_hello_interval_cmd,
! 1329: "isis hello-interval (<1-65535>|minimal)",
! 1330: "IS-IS commands\n"
! 1331: "Set Hello interval\n"
! 1332: "Hello interval value\n"
! 1333: "Holdtime 1 seconds, interval depends on multiplier\n")
! 1334: {
! 1335: struct isis_circuit *circuit;
! 1336: struct interface *ifp;
! 1337: int interval;
! 1338: char c;
! 1339:
! 1340: ifp = vty->index;
! 1341: circuit = ifp->info;
! 1342: if (circuit == NULL)
! 1343: {
! 1344: return CMD_WARNING;
! 1345: }
! 1346: assert (circuit);
! 1347: c = *argv[0];
! 1348: if (isdigit ((int) c))
! 1349: {
! 1350: interval = atoi (argv[0]);
! 1351: }
! 1352: else
! 1353: interval = HELLO_MINIMAL; /* FIXME: should be calculated */
! 1354:
! 1355: circuit->hello_interval[0] = (u_int16_t) interval;
! 1356: circuit->hello_interval[1] = (u_int16_t) interval;
! 1357:
! 1358: return CMD_SUCCESS;
! 1359: }
! 1360:
! 1361: DEFUN (no_isis_hello_interval,
! 1362: no_isis_hello_interval_cmd,
! 1363: "no isis hello-interval",
! 1364: NO_STR
! 1365: "IS-IS commands\n"
! 1366: "Set Hello interval\n")
! 1367: {
! 1368: struct isis_circuit *circuit;
! 1369: struct interface *ifp;
! 1370:
! 1371: ifp = vty->index;
! 1372: circuit = ifp->info;
! 1373: if (circuit == NULL)
! 1374: {
! 1375: return CMD_WARNING;
! 1376: }
! 1377: assert (circuit);
! 1378:
! 1379:
! 1380: circuit->hello_interval[0] = HELLO_INTERVAL; /* Default is 1 sec. */
! 1381: circuit->hello_interval[1] = HELLO_INTERVAL;
! 1382:
! 1383: return CMD_SUCCESS;
! 1384: }
! 1385:
! 1386: ALIAS (no_isis_hello_interval,
! 1387: no_isis_hello_interval_arg_cmd,
! 1388: "no isis hello-interval (<1-65535>|minimal)",
! 1389: NO_STR
! 1390: "IS-IS commands\n"
! 1391: "Set Hello interval\n"
! 1392: "Hello interval value\n"
! 1393: "Holdtime 1 second, interval depends on multiplier\n")
! 1394:
! 1395: DEFUN (isis_hello_interval_l1,
! 1396: isis_hello_interval_l1_cmd,
! 1397: "isis hello-interval (<1-65535>|minimal) level-1",
! 1398: "IS-IS commands\n"
! 1399: "Set Hello interval\n"
! 1400: "Hello interval value\n"
! 1401: "Holdtime 1 second, interval depends on multiplier\n"
! 1402: "Specify hello-interval for level-1 IIHs\n")
! 1403: {
! 1404: struct isis_circuit *circuit;
! 1405: struct interface *ifp;
! 1406: long interval;
! 1407: char c;
! 1408:
! 1409: ifp = vty->index;
! 1410: circuit = ifp->info;
! 1411: if (circuit == NULL)
! 1412: {
! 1413: return CMD_WARNING;
! 1414: }
! 1415: assert (circuit);
! 1416:
! 1417: c = *argv[0];
! 1418: if (isdigit ((int) c))
! 1419: {
! 1420: interval = atoi (argv[0]);
! 1421: }
! 1422: else
! 1423: interval = HELLO_MINIMAL;
! 1424:
! 1425: circuit->hello_interval[0] = (u_int16_t) interval;
! 1426:
! 1427: return CMD_SUCCESS;
! 1428: }
! 1429:
! 1430: DEFUN (no_isis_hello_interval_l1,
! 1431: no_isis_hello_interval_l1_cmd,
! 1432: "no isis hello-interval level-1",
! 1433: NO_STR
! 1434: "IS-IS commands\n"
! 1435: "Set Hello interval\n"
! 1436: "Specify hello-interval for level-1 IIHs\n")
! 1437: {
! 1438: struct isis_circuit *circuit;
! 1439: struct interface *ifp;
! 1440:
! 1441: ifp = vty->index;
! 1442: circuit = ifp->info;
! 1443: if (circuit == NULL)
! 1444: {
! 1445: return CMD_WARNING;
! 1446: }
! 1447: assert (circuit);
! 1448:
! 1449:
! 1450: circuit->hello_interval[0] = HELLO_INTERVAL; /* Default is 1 sec. */
! 1451:
! 1452: return CMD_SUCCESS;
! 1453: }
! 1454:
! 1455: ALIAS (no_isis_hello_interval_l1,
! 1456: no_isis_hello_interval_l1_arg_cmd,
! 1457: "no isis hello-interval (<1-65535>|minimal) level-1",
! 1458: NO_STR
! 1459: "IS-IS commands\n"
! 1460: "Set Hello interval\n"
! 1461: "Hello interval value\n"
! 1462: "Holdtime 1 second, interval depends on multiplier\n"
! 1463: "Specify hello-interval for level-1 IIHs\n")
! 1464:
! 1465: DEFUN (isis_hello_interval_l2,
! 1466: isis_hello_interval_l2_cmd,
! 1467: "isis hello-interval (<1-65535>|minimal) level-2",
! 1468: "IS-IS commands\n"
! 1469: "Set Hello interval\n"
! 1470: "Hello interval value\n"
! 1471: "Holdtime 1 second, interval depends on multiplier\n"
! 1472: "Specify hello-interval for level-2 IIHs\n")
! 1473: {
! 1474: struct isis_circuit *circuit;
! 1475: struct interface *ifp;
! 1476: long interval;
! 1477: char c;
! 1478:
! 1479: ifp = vty->index;
! 1480: circuit = ifp->info;
! 1481: if (circuit == NULL)
! 1482: {
! 1483: return CMD_WARNING;
! 1484: }
! 1485: assert (circuit);
! 1486:
! 1487: c = *argv[0];
! 1488: if (isdigit ((int) c))
! 1489: {
! 1490: interval = atoi (argv[0]);
! 1491: }
! 1492: else
! 1493: interval = HELLO_MINIMAL;
! 1494:
! 1495: circuit->hello_interval[1] = (u_int16_t) interval;
! 1496:
! 1497: return CMD_SUCCESS;
! 1498: }
! 1499:
! 1500: DEFUN (no_isis_hello_interval_l2,
! 1501: no_isis_hello_interval_l2_cmd,
! 1502: "no isis hello-interval level-2",
! 1503: NO_STR
! 1504: "IS-IS commands\n"
! 1505: "Set Hello interval\n"
! 1506: "Specify hello-interval for level-2 IIHs\n")
! 1507: {
! 1508: struct isis_circuit *circuit;
! 1509: struct interface *ifp;
! 1510:
! 1511: ifp = vty->index;
! 1512: circuit = ifp->info;
! 1513: if (circuit == NULL)
! 1514: {
! 1515: return CMD_WARNING;
! 1516: }
! 1517: assert (circuit);
! 1518:
! 1519:
! 1520: circuit->hello_interval[1] = HELLO_INTERVAL; /* Default is 1 sec. */
! 1521:
! 1522: return CMD_SUCCESS;
! 1523: }
! 1524:
! 1525: ALIAS (no_isis_hello_interval_l2,
! 1526: no_isis_hello_interval_l2_arg_cmd,
! 1527: "no isis hello-interval (<1-65535>|minimal) level-2",
! 1528: NO_STR
! 1529: "IS-IS commands\n"
! 1530: "Set Hello interval\n"
! 1531: "Hello interval value\n"
! 1532: "Holdtime 1 second, interval depends on multiplier\n"
! 1533: "Specify hello-interval for level-2 IIHs\n")
! 1534:
! 1535: DEFUN (isis_hello_multiplier,
! 1536: isis_hello_multiplier_cmd,
! 1537: "isis hello-multiplier <3-1000>",
! 1538: "IS-IS commands\n"
! 1539: "Set multiplier for Hello holding time\n"
! 1540: "Hello multiplier value\n")
! 1541: {
! 1542: struct isis_circuit *circuit;
! 1543: struct interface *ifp;
! 1544: int mult;
! 1545:
! 1546: ifp = vty->index;
! 1547: circuit = ifp->info;
! 1548: if (circuit == NULL)
! 1549: {
! 1550: return CMD_WARNING;
! 1551: }
! 1552: assert (circuit);
! 1553:
! 1554: mult = atoi (argv[0]);
! 1555:
! 1556: circuit->hello_multiplier[0] = (u_int16_t) mult;
! 1557: circuit->hello_multiplier[1] = (u_int16_t) mult;
! 1558:
! 1559: return CMD_SUCCESS;
! 1560: }
! 1561:
! 1562: DEFUN (no_isis_hello_multiplier,
! 1563: no_isis_hello_multiplier_cmd,
! 1564: "no isis hello-multiplier",
! 1565: NO_STR
! 1566: "IS-IS commands\n"
! 1567: "Set multiplier for Hello holding time\n")
! 1568: {
! 1569: struct isis_circuit *circuit;
! 1570: struct interface *ifp;
! 1571:
! 1572: ifp = vty->index;
! 1573: circuit = ifp->info;
! 1574: if (circuit == NULL)
! 1575: {
! 1576: return CMD_WARNING;
! 1577: }
! 1578: assert (circuit);
! 1579:
! 1580: circuit->hello_multiplier[0] = HELLO_MULTIPLIER;
! 1581: circuit->hello_multiplier[1] = HELLO_MULTIPLIER;
! 1582:
! 1583: return CMD_SUCCESS;
! 1584: }
! 1585:
! 1586: ALIAS (no_isis_hello_multiplier,
! 1587: no_isis_hello_multiplier_arg_cmd,
! 1588: "no isis hello-multiplier <3-1000>",
! 1589: NO_STR
! 1590: "IS-IS commands\n"
! 1591: "Set multiplier for Hello holding time\n"
! 1592: "Hello multiplier value\n")
! 1593:
! 1594: DEFUN (isis_hello_multiplier_l1,
! 1595: isis_hello_multiplier_l1_cmd,
! 1596: "isis hello-multiplier <3-1000> level-1",
! 1597: "IS-IS commands\n"
! 1598: "Set multiplier for Hello holding time\n"
! 1599: "Hello multiplier value\n"
! 1600: "Specify hello multiplier for level-1 IIHs\n")
! 1601: {
! 1602: struct isis_circuit *circuit;
! 1603: struct interface *ifp;
! 1604: int mult;
! 1605:
! 1606: ifp = vty->index;
! 1607: circuit = ifp->info;
! 1608: if (circuit == NULL)
! 1609: {
! 1610: return CMD_WARNING;
! 1611: }
! 1612: assert (circuit);
! 1613:
! 1614: mult = atoi (argv[0]);
! 1615:
! 1616: circuit->hello_multiplier[0] = (u_int16_t) mult;
! 1617:
! 1618: return CMD_SUCCESS;
! 1619: }
! 1620:
! 1621: DEFUN (no_isis_hello_multiplier_l1,
! 1622: no_isis_hello_multiplier_l1_cmd,
! 1623: "no isis hello-multiplier level-1",
! 1624: NO_STR
! 1625: "IS-IS commands\n"
! 1626: "Set multiplier for Hello holding time\n"
! 1627: "Specify hello multiplier for level-1 IIHs\n")
! 1628: {
! 1629: struct isis_circuit *circuit;
! 1630: struct interface *ifp;
! 1631:
! 1632: ifp = vty->index;
! 1633: circuit = ifp->info;
! 1634: if (circuit == NULL)
! 1635: {
! 1636: return CMD_WARNING;
! 1637: }
! 1638: assert (circuit);
! 1639:
! 1640: circuit->hello_multiplier[0] = HELLO_MULTIPLIER;
! 1641:
! 1642: return CMD_SUCCESS;
! 1643: }
! 1644:
! 1645: ALIAS (no_isis_hello_multiplier_l1,
! 1646: no_isis_hello_multiplier_l1_arg_cmd,
! 1647: "no isis hello-multiplier <3-1000> level-1",
! 1648: NO_STR
! 1649: "IS-IS commands\n"
! 1650: "Set multiplier for Hello holding time\n"
! 1651: "Hello multiplier value\n"
! 1652: "Specify hello multiplier for level-1 IIHs\n")
! 1653:
! 1654: DEFUN (isis_hello_multiplier_l2,
! 1655: isis_hello_multiplier_l2_cmd,
! 1656: "isis hello-multiplier <3-1000> level-2",
! 1657: "IS-IS commands\n"
! 1658: "Set multiplier for Hello holding time\n"
! 1659: "Hello multiplier value\n"
! 1660: "Specify hello multiplier for level-2 IIHs\n")
! 1661: {
! 1662: struct isis_circuit *circuit;
! 1663: struct interface *ifp;
! 1664: int mult;
! 1665:
! 1666: ifp = vty->index;
! 1667: circuit = ifp->info;
! 1668: if (circuit == NULL)
! 1669: {
! 1670: return CMD_WARNING;
! 1671: }
! 1672: assert (circuit);
! 1673:
! 1674: mult = atoi (argv[0]);
! 1675:
! 1676: circuit->hello_multiplier[1] = (u_int16_t) mult;
! 1677:
! 1678: return CMD_SUCCESS;
! 1679: }
! 1680:
! 1681: DEFUN (no_isis_hello_multiplier_l2,
! 1682: no_isis_hello_multiplier_l2_cmd,
! 1683: "no isis hello-multiplier level-2",
! 1684: NO_STR
! 1685: "IS-IS commands\n"
! 1686: "Set multiplier for Hello holding time\n"
! 1687: "Specify hello multiplier for level-2 IIHs\n")
! 1688: {
! 1689: struct isis_circuit *circuit;
! 1690: struct interface *ifp;
! 1691:
! 1692: ifp = vty->index;
! 1693: circuit = ifp->info;
! 1694: if (circuit == NULL)
! 1695: {
! 1696: return CMD_WARNING;
! 1697: }
! 1698: assert (circuit);
! 1699:
! 1700: circuit->hello_multiplier[1] = HELLO_MULTIPLIER;
! 1701:
! 1702: return CMD_SUCCESS;
! 1703: }
! 1704:
! 1705: ALIAS (no_isis_hello_multiplier_l2,
! 1706: no_isis_hello_multiplier_l2_arg_cmd,
! 1707: "no isis hello-multiplier <3-1000> level-2",
! 1708: NO_STR
! 1709: "IS-IS commands\n"
! 1710: "Set multiplier for Hello holding time\n"
! 1711: "Hello multiplier value\n"
! 1712: "Specify hello multiplier for level-2 IIHs\n")
! 1713:
! 1714: DEFUN (isis_hello,
! 1715: isis_hello_cmd,
! 1716: "isis hello padding",
! 1717: "IS-IS commands\n"
! 1718: "Add padding to IS-IS hello packets\n"
! 1719: "Pad hello packets\n"
! 1720: "<cr>\n")
! 1721: {
! 1722: struct interface *ifp;
! 1723: struct isis_circuit *circuit;
! 1724:
! 1725: ifp = vty->index;
! 1726: circuit = ifp->info;
! 1727: if (circuit == NULL)
! 1728: {
! 1729: return CMD_WARNING;
! 1730: }
! 1731: assert (circuit);
! 1732:
! 1733: circuit->u.bc.pad_hellos = 1;
! 1734:
! 1735: return CMD_SUCCESS;
! 1736: }
! 1737:
! 1738: DEFUN (no_isis_hello,
! 1739: no_isis_hello_cmd,
! 1740: "no isis hello padding",
! 1741: NO_STR
! 1742: "IS-IS commands\n"
! 1743: "Add padding to IS-IS hello packets\n"
! 1744: "Pad hello packets\n"
! 1745: "<cr>\n")
! 1746: {
! 1747: struct isis_circuit *circuit;
! 1748: struct interface *ifp;
! 1749:
! 1750: ifp = vty->index;
! 1751: circuit = ifp->info;
! 1752: if (circuit == NULL)
! 1753: {
! 1754: return CMD_WARNING;
! 1755: }
! 1756: assert (circuit);
! 1757:
! 1758: circuit->u.bc.pad_hellos = 0;
! 1759:
! 1760: return CMD_SUCCESS;
! 1761: }
! 1762:
! 1763: DEFUN (csnp_interval,
! 1764: csnp_interval_cmd,
! 1765: "isis csnp-interval <0-65535>",
! 1766: "IS-IS commands\n"
! 1767: "Set CSNP interval in seconds\n"
! 1768: "CSNP interval value\n")
! 1769: {
! 1770: struct isis_circuit *circuit;
! 1771: struct interface *ifp;
! 1772: unsigned long interval;
! 1773:
! 1774: ifp = vty->index;
! 1775: circuit = ifp->info;
! 1776: if (circuit == NULL)
! 1777: {
! 1778: return CMD_WARNING;
! 1779: }
! 1780: assert (circuit);
! 1781:
! 1782: interval = atol (argv[0]);
! 1783:
! 1784: circuit->csnp_interval[0] = (u_int16_t) interval;
! 1785: circuit->csnp_interval[1] = (u_int16_t) interval;
! 1786:
! 1787: return CMD_SUCCESS;
! 1788: }
! 1789:
! 1790: DEFUN (no_csnp_interval,
! 1791: no_csnp_interval_cmd,
! 1792: "no isis csnp-interval",
! 1793: NO_STR
! 1794: "IS-IS commands\n"
! 1795: "Set CSNP interval in seconds\n")
! 1796: {
! 1797: struct isis_circuit *circuit;
! 1798: struct interface *ifp;
! 1799:
! 1800: ifp = vty->index;
! 1801: circuit = ifp->info;
! 1802: if (circuit == NULL)
! 1803: {
! 1804: return CMD_WARNING;
! 1805: }
! 1806: assert (circuit);
! 1807:
! 1808: circuit->csnp_interval[0] = CSNP_INTERVAL;
! 1809: circuit->csnp_interval[1] = CSNP_INTERVAL;
! 1810:
! 1811: return CMD_SUCCESS;
! 1812: }
! 1813:
! 1814: ALIAS (no_csnp_interval,
! 1815: no_csnp_interval_arg_cmd,
! 1816: "no isis csnp-interval <0-65535>",
! 1817: NO_STR
! 1818: "IS-IS commands\n"
! 1819: "Set CSNP interval in seconds\n"
! 1820: "CSNP interval value\n")
! 1821:
! 1822: DEFUN (csnp_interval_l1,
! 1823: csnp_interval_l1_cmd,
! 1824: "isis csnp-interval <0-65535> level-1",
! 1825: "IS-IS commands\n"
! 1826: "Set CSNP interval in seconds\n"
! 1827: "CSNP interval value\n"
! 1828: "Specify interval for level-1 CSNPs\n")
! 1829: {
! 1830: struct isis_circuit *circuit;
! 1831: struct interface *ifp;
! 1832: unsigned long interval;
! 1833:
! 1834: ifp = vty->index;
! 1835: circuit = ifp->info;
! 1836: if (circuit == NULL)
! 1837: {
! 1838: return CMD_WARNING;
! 1839: }
! 1840: assert (circuit);
! 1841:
! 1842: interval = atol (argv[0]);
! 1843:
! 1844: circuit->csnp_interval[0] = (u_int16_t) interval;
! 1845:
! 1846: return CMD_SUCCESS;
! 1847: }
! 1848:
! 1849: DEFUN (no_csnp_interval_l1,
! 1850: no_csnp_interval_l1_cmd,
! 1851: "no isis csnp-interval level-1",
! 1852: NO_STR
! 1853: "IS-IS commands\n"
! 1854: "Set CSNP interval in seconds\n"
! 1855: "Specify interval for level-1 CSNPs\n")
! 1856: {
! 1857: struct isis_circuit *circuit;
! 1858: struct interface *ifp;
! 1859:
! 1860: ifp = vty->index;
! 1861: circuit = ifp->info;
! 1862: if (circuit == NULL)
! 1863: {
! 1864: return CMD_WARNING;
! 1865: }
! 1866: assert (circuit);
! 1867:
! 1868: circuit->csnp_interval[0] = CSNP_INTERVAL;
! 1869:
! 1870: return CMD_SUCCESS;
! 1871: }
! 1872:
! 1873: ALIAS (no_csnp_interval_l1,
! 1874: no_csnp_interval_l1_arg_cmd,
! 1875: "no isis csnp-interval <0-65535> level-1",
! 1876: NO_STR
! 1877: "IS-IS commands\n"
! 1878: "Set CSNP interval in seconds\n"
! 1879: "CSNP interval value\n"
! 1880: "Specify interval for level-1 CSNPs\n")
! 1881:
! 1882: DEFUN (csnp_interval_l2,
! 1883: csnp_interval_l2_cmd,
! 1884: "isis csnp-interval <0-65535> level-2",
! 1885: "IS-IS commands\n"
! 1886: "Set CSNP interval in seconds\n"
! 1887: "CSNP interval value\n"
! 1888: "Specify interval for level-2 CSNPs\n")
! 1889: {
! 1890: struct isis_circuit *circuit;
! 1891: struct interface *ifp;
! 1892: unsigned long interval;
! 1893:
! 1894: ifp = vty->index;
! 1895: circuit = ifp->info;
! 1896: if (circuit == NULL)
! 1897: {
! 1898: return CMD_WARNING;
! 1899: }
! 1900: assert (circuit);
! 1901:
! 1902: interval = atol (argv[0]);
! 1903:
! 1904: circuit->csnp_interval[1] = (u_int16_t) interval;
! 1905:
! 1906: return CMD_SUCCESS;
! 1907: }
! 1908:
! 1909: DEFUN (no_csnp_interval_l2,
! 1910: no_csnp_interval_l2_cmd,
! 1911: "no isis csnp-interval level-2",
! 1912: NO_STR
! 1913: "IS-IS commands\n"
! 1914: "Set CSNP interval in seconds\n"
! 1915: "Specify interval for level-2 CSNPs\n")
! 1916: {
! 1917: struct isis_circuit *circuit;
! 1918: struct interface *ifp;
! 1919:
! 1920: ifp = vty->index;
! 1921: circuit = ifp->info;
! 1922: if (circuit == NULL)
! 1923: {
! 1924: return CMD_WARNING;
! 1925: }
! 1926: assert (circuit);
! 1927:
! 1928: circuit->csnp_interval[1] = CSNP_INTERVAL;
! 1929:
! 1930: return CMD_SUCCESS;
! 1931: }
! 1932:
! 1933: ALIAS (no_csnp_interval_l2,
! 1934: no_csnp_interval_l2_arg_cmd,
! 1935: "no isis csnp-interval <0-65535> level-2",
! 1936: NO_STR
! 1937: "IS-IS commands\n"
! 1938: "Set CSNP interval in seconds\n"
! 1939: "CSNP interval value\n"
! 1940: "Specify interval for level-2 CSNPs\n")
! 1941:
! 1942: #ifdef HAVE_IPV6
! 1943: DEFUN (ipv6_router_isis,
! 1944: ipv6_router_isis_cmd,
! 1945: "ipv6 router isis WORD",
! 1946: "IPv6 interface subcommands\n"
! 1947: "IPv6 Router interface commands\n"
! 1948: "IS-IS Routing for IPv6\n"
! 1949: "Routing process tag\n")
! 1950: {
! 1951: struct isis_circuit *c;
! 1952: struct interface *ifp;
! 1953: struct isis_area *area;
! 1954:
! 1955: ifp = (struct interface *) vty->index;
! 1956: assert (ifp);
! 1957:
! 1958: area = isis_area_lookup (argv[0]);
! 1959:
! 1960: /* Prevent more than one circuit per interface */
! 1961: if (area)
! 1962: c = circuit_lookup_by_ifp (ifp, area->circuit_list);
! 1963: else
! 1964: c = NULL;
! 1965:
! 1966: if (c && (ifp->info != NULL))
! 1967: {
! 1968: if (c->ipv6_router == 1)
! 1969: {
! 1970: vty_out (vty, "ISIS circuit is already defined for IPv6%s",
! 1971: VTY_NEWLINE);
! 1972: return CMD_WARNING;
! 1973: }
! 1974: }
! 1975:
! 1976: /* this is here for ciscopability */
! 1977: if (!area)
! 1978: {
! 1979: vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE);
! 1980: return CMD_WARNING;
! 1981: }
! 1982:
! 1983: if (!c)
! 1984: {
! 1985: c = circuit_lookup_by_ifp (ifp, isis->init_circ_list);
! 1986: c = isis_csm_state_change (ISIS_ENABLE, c, area);
! 1987: c->interface = ifp;
! 1988: ifp->info = c;
! 1989: }
! 1990:
! 1991: if (!c)
! 1992: return CMD_WARNING;
! 1993:
! 1994: c->ipv6_router = 1;
! 1995: area->ipv6_circuits++;
! 1996: circuit_update_nlpids (c);
! 1997:
! 1998: vty->node = INTERFACE_NODE;
! 1999:
! 2000: return CMD_SUCCESS;
! 2001: }
! 2002:
! 2003: DEFUN (no_ipv6_router_isis,
! 2004: no_ipv6_router_isis_cmd,
! 2005: "no ipv6 router isis WORD",
! 2006: NO_STR
! 2007: "IPv6 interface subcommands\n"
! 2008: "IPv6 Router interface commands\n"
! 2009: "IS-IS Routing for IPv6\n"
! 2010: "Routing process tag\n")
! 2011: {
! 2012: struct isis_circuit *c;
! 2013: struct interface *ifp;
! 2014: struct isis_area *area;
! 2015:
! 2016: ifp = (struct interface *) vty->index;
! 2017: /* UGLY - will remove l8r
! 2018: if (circuit == NULL) {
! 2019: return CMD_WARNING;
! 2020: } */
! 2021: assert (ifp);
! 2022:
! 2023: area = isis_area_lookup (argv[0]);
! 2024: if (!area)
! 2025: {
! 2026: vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE);
! 2027: return CMD_WARNING;
! 2028: }
! 2029:
! 2030: c = circuit_lookup_by_ifp (ifp, area->circuit_list);
! 2031: if (!c)
! 2032: return CMD_WARNING;
! 2033:
! 2034: c->ipv6_router = 0;
! 2035: area->ipv6_circuits--;
! 2036: if (c->ip_router == 0)
! 2037: isis_csm_state_change (ISIS_DISABLE, c, area);
! 2038:
! 2039: return CMD_SUCCESS;
! 2040: }
! 2041: #endif /* HAVE_IPV6 */
! 2042:
! 2043: static struct cmd_node interface_node = {
! 2044: INTERFACE_NODE,
! 2045: "%s(config-if)# ",
! 2046: 1,
! 2047: };
! 2048:
! 2049: int
! 2050: isis_if_new_hook (struct interface *ifp)
! 2051: {
! 2052: /* FIXME: Discuss if the circuit should be created here
! 2053: ifp->info = XMALLOC (MTYPE_ISIS_IF_INFO, sizeof (struct isis_if_info)); */
! 2054: ifp->info = NULL;
! 2055: return 0;
! 2056: }
! 2057:
! 2058: int
! 2059: isis_if_delete_hook (struct interface *ifp)
! 2060: {
! 2061: /* FIXME: Discuss if the circuit should be created here
! 2062: XFREE (MTYPE_ISIS_IF_INFO, ifp->info);*/
! 2063: ifp->info = NULL;
! 2064: return 0;
! 2065: }
! 2066:
! 2067: void
! 2068: isis_circuit_init ()
! 2069: {
! 2070: /* Initialize Zebra interface data structure */
! 2071: if_init ();
! 2072: if_add_hook (IF_NEW_HOOK, isis_if_new_hook);
! 2073: if_add_hook (IF_DELETE_HOOK, isis_if_delete_hook);
! 2074:
! 2075: /* Install interface node */
! 2076: install_node (&interface_node, isis_interface_config_write);
! 2077: install_element (CONFIG_NODE, &interface_cmd);
! 2078:
! 2079: install_default (INTERFACE_NODE);
! 2080: install_element (INTERFACE_NODE, &interface_desc_cmd);
! 2081: install_element (INTERFACE_NODE, &no_interface_desc_cmd);
! 2082:
! 2083: install_element (INTERFACE_NODE, &ip_router_isis_cmd);
! 2084: install_element (INTERFACE_NODE, &no_ip_router_isis_cmd);
! 2085:
! 2086: install_element (INTERFACE_NODE, &isis_circuit_type_cmd);
! 2087: install_element (INTERFACE_NODE, &no_isis_circuit_type_cmd);
! 2088:
! 2089: install_element (INTERFACE_NODE, &isis_passwd_cmd);
! 2090: install_element (INTERFACE_NODE, &no_isis_passwd_cmd);
! 2091:
! 2092: install_element (INTERFACE_NODE, &isis_priority_cmd);
! 2093: install_element (INTERFACE_NODE, &no_isis_priority_cmd);
! 2094: install_element (INTERFACE_NODE, &no_isis_priority_arg_cmd);
! 2095: install_element (INTERFACE_NODE, &isis_priority_l1_cmd);
! 2096: install_element (INTERFACE_NODE, &no_isis_priority_l1_cmd);
! 2097: install_element (INTERFACE_NODE, &no_isis_priority_l1_arg_cmd);
! 2098: install_element (INTERFACE_NODE, &isis_priority_l2_cmd);
! 2099: install_element (INTERFACE_NODE, &no_isis_priority_l2_cmd);
! 2100: install_element (INTERFACE_NODE, &no_isis_priority_l2_arg_cmd);
! 2101:
! 2102: install_element (INTERFACE_NODE, &isis_metric_cmd);
! 2103: install_element (INTERFACE_NODE, &no_isis_metric_cmd);
! 2104: install_element (INTERFACE_NODE, &no_isis_metric_arg_cmd);
! 2105:
! 2106: install_element (INTERFACE_NODE, &isis_hello_interval_cmd);
! 2107: install_element (INTERFACE_NODE, &no_isis_hello_interval_cmd);
! 2108: install_element (INTERFACE_NODE, &no_isis_hello_interval_arg_cmd);
! 2109: install_element (INTERFACE_NODE, &isis_hello_interval_l1_cmd);
! 2110: install_element (INTERFACE_NODE, &no_isis_hello_interval_l1_cmd);
! 2111: install_element (INTERFACE_NODE, &no_isis_hello_interval_l1_arg_cmd);
! 2112: install_element (INTERFACE_NODE, &isis_hello_interval_l2_cmd);
! 2113: install_element (INTERFACE_NODE, &no_isis_hello_interval_l2_cmd);
! 2114: install_element (INTERFACE_NODE, &no_isis_hello_interval_l2_arg_cmd);
! 2115:
! 2116: install_element (INTERFACE_NODE, &isis_hello_multiplier_cmd);
! 2117: install_element (INTERFACE_NODE, &no_isis_hello_multiplier_cmd);
! 2118: install_element (INTERFACE_NODE, &no_isis_hello_multiplier_arg_cmd);
! 2119: install_element (INTERFACE_NODE, &isis_hello_multiplier_l1_cmd);
! 2120: install_element (INTERFACE_NODE, &no_isis_hello_multiplier_l1_cmd);
! 2121: install_element (INTERFACE_NODE, &no_isis_hello_multiplier_l1_arg_cmd);
! 2122: install_element (INTERFACE_NODE, &isis_hello_multiplier_l2_cmd);
! 2123: install_element (INTERFACE_NODE, &no_isis_hello_multiplier_l2_cmd);
! 2124: install_element (INTERFACE_NODE, &no_isis_hello_multiplier_l2_arg_cmd);
! 2125:
! 2126: install_element (INTERFACE_NODE, &isis_hello_cmd);
! 2127: install_element (INTERFACE_NODE, &no_isis_hello_cmd);
! 2128: install_element (INTERFACE_NODE, &csnp_interval_cmd);
! 2129: install_element (INTERFACE_NODE, &no_csnp_interval_cmd);
! 2130: install_element (INTERFACE_NODE, &no_csnp_interval_arg_cmd);
! 2131: install_element (INTERFACE_NODE, &csnp_interval_l1_cmd);
! 2132: install_element (INTERFACE_NODE, &no_csnp_interval_l1_cmd);
! 2133: install_element (INTERFACE_NODE, &no_csnp_interval_l1_arg_cmd);
! 2134: install_element (INTERFACE_NODE, &csnp_interval_l2_cmd);
! 2135: install_element (INTERFACE_NODE, &no_csnp_interval_l2_cmd);
! 2136: install_element (INTERFACE_NODE, &no_csnp_interval_l2_arg_cmd);
! 2137:
! 2138: #ifdef HAVE_IPV6
! 2139: install_element (INTERFACE_NODE, &ipv6_router_isis_cmd);
! 2140: install_element (INTERFACE_NODE, &no_ipv6_router_isis_cmd);
! 2141: #endif
! 2142: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>