Annotation of embedaddon/quagga/isisd/isis_zebra.c, revision 1.1
1.1 ! misho 1: /*
! 2: * IS-IS Rout(e)ing protocol - isis_zebra.c
! 3: *
! 4: * Copyright (C) 2001,2002 Sampo Saaristo
! 5: * Tampere University of Technology
! 6: * Institute of Communications Engineering
! 7: *
! 8: * This program is free software; you can redistribute it and/or modify it
! 9: * under the terms of the GNU General Public Licenseas published by the Free
! 10: * Software Foundation; either version 2 of the License, or (at your option)
! 11: * any later version.
! 12: *
! 13: * This program is distributed in the hope that it will be useful,but WITHOUT
! 14: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
! 15: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
! 16: * more details.
! 17:
! 18: * You should have received a copy of the GNU General Public License along
! 19: * with this program; if not, write to the Free Software Foundation, Inc.,
! 20: * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
! 21: */
! 22:
! 23: #include <zebra.h>
! 24:
! 25: #include "thread.h"
! 26: #include "command.h"
! 27: #include "memory.h"
! 28: #include "log.h"
! 29: #include "if.h"
! 30: #include "network.h"
! 31: #include "prefix.h"
! 32: #include "zclient.h"
! 33: #include "stream.h"
! 34: #include "linklist.h"
! 35:
! 36: #include "isisd/dict.h"
! 37: #include "isisd/isis_constants.h"
! 38: #include "isisd/isis_common.h"
! 39: #include "isisd/isisd.h"
! 40: #include "isisd/isis_circuit.h"
! 41: #include "isisd/isis_csm.h"
! 42: #include "isisd/isis_route.h"
! 43: #include "isisd/isis_zebra.h"
! 44:
! 45: struct zclient *zclient = NULL;
! 46:
! 47: extern struct thread_master *master;
! 48: extern struct isis *isis;
! 49:
! 50: struct in_addr router_id_zebra;
! 51:
! 52: /* Router-id update message from zebra. */
! 53: static int
! 54: isis_router_id_update_zebra (int command, struct zclient *zclient,
! 55: zebra_size_t length)
! 56: {
! 57: struct prefix router_id;
! 58:
! 59: zebra_router_id_update_read (zclient->ibuf,&router_id);
! 60: router_id_zebra = router_id.u.prefix4;
! 61:
! 62: /* FIXME: Do we react somehow? */
! 63: return 0;
! 64: }
! 65:
! 66: static int
! 67: isis_zebra_if_add (int command, struct zclient *zclient, zebra_size_t length)
! 68: {
! 69: struct interface *ifp;
! 70:
! 71: ifp = zebra_interface_add_read (zclient->ibuf);
! 72:
! 73: if (isis->debugs & DEBUG_ZEBRA)
! 74: zlog_debug ("Zebra I/F add: %s index %d flags %ld metric %d mtu %d",
! 75: ifp->name, ifp->ifindex, (long)ifp->flags, ifp->metric, ifp->mtu);
! 76:
! 77: if (if_is_operative (ifp))
! 78: isis_csm_state_change (IF_UP_FROM_Z, circuit_scan_by_ifp (ifp), ifp);
! 79:
! 80: return 0;
! 81: }
! 82:
! 83: static int
! 84: isis_zebra_if_del (int command, struct zclient *zclient, zebra_size_t length)
! 85: {
! 86: struct interface *ifp;
! 87: struct stream *s;
! 88:
! 89: s = zclient->ibuf;
! 90: ifp = zebra_interface_state_read (s);
! 91:
! 92: if (!ifp)
! 93: return 0;
! 94:
! 95: if (if_is_operative (ifp))
! 96: zlog_warn ("Zebra: got delete of %s, but interface is still up",
! 97: ifp->name);
! 98:
! 99: if (isis->debugs & DEBUG_ZEBRA)
! 100: zlog_debug ("Zebra I/F delete: %s index %d flags %ld metric %d mtu %d",
! 101: ifp->name, ifp->ifindex, (long)ifp->flags, ifp->metric, ifp->mtu);
! 102:
! 103:
! 104: /* Cannot call if_delete because we should retain the pseudo interface
! 105: in case there is configuration info attached to it. */
! 106: if_delete_retain(ifp);
! 107:
! 108: isis_csm_state_change (IF_DOWN_FROM_Z, circuit_scan_by_ifp (ifp), ifp);
! 109:
! 110: ifp->ifindex = IFINDEX_INTERNAL;
! 111:
! 112: return 0;
! 113: }
! 114:
! 115: static struct interface *
! 116: zebra_interface_if_lookup (struct stream *s)
! 117: {
! 118: char ifname_tmp[INTERFACE_NAMSIZ];
! 119:
! 120: /* Read interface name. */
! 121: stream_get (ifname_tmp, s, INTERFACE_NAMSIZ);
! 122:
! 123: /* And look it up. */
! 124: return if_lookup_by_name_len(ifname_tmp,
! 125: strnlen(ifname_tmp, INTERFACE_NAMSIZ));
! 126: }
! 127:
! 128: static int
! 129: isis_zebra_if_state_up (int command, struct zclient *zclient,
! 130: zebra_size_t length)
! 131: {
! 132: struct interface *ifp;
! 133:
! 134: ifp = zebra_interface_if_lookup (zclient->ibuf);
! 135:
! 136: if (!ifp)
! 137: return 0;
! 138:
! 139: if (if_is_operative (ifp))
! 140: {
! 141: zebra_interface_if_set_value (zclient->ibuf, ifp);
! 142: /* HT: This is wrong actually. We can't assume that circuit exist
! 143: * if we delete circuit during if_state_down event. Needs rethink.
! 144: * TODO */
! 145: isis_circuit_update_params (circuit_scan_by_ifp (ifp), ifp);
! 146: return 0;
! 147: }
! 148:
! 149: zebra_interface_if_set_value (zclient->ibuf, ifp);
! 150: isis_csm_state_change (IF_UP_FROM_Z, circuit_scan_by_ifp (ifp), ifp);
! 151:
! 152: return 0;
! 153: }
! 154:
! 155: static int
! 156: isis_zebra_if_state_down (int command, struct zclient *zclient,
! 157: zebra_size_t length)
! 158: {
! 159: struct interface *ifp;
! 160:
! 161: ifp = zebra_interface_if_lookup (zclient->ibuf);
! 162:
! 163: if (ifp == NULL)
! 164: return 0;
! 165:
! 166: if (if_is_operative (ifp))
! 167: {
! 168: zebra_interface_if_set_value (zclient->ibuf, ifp);
! 169: isis_csm_state_change (IF_DOWN_FROM_Z, circuit_scan_by_ifp (ifp), ifp);
! 170: }
! 171:
! 172: return 0;
! 173: }
! 174:
! 175: static int
! 176: isis_zebra_if_address_add (int command, struct zclient *zclient,
! 177: zebra_size_t length)
! 178: {
! 179: struct connected *c;
! 180: struct prefix *p;
! 181: char buf[BUFSIZ];
! 182:
! 183: c = zebra_interface_address_read (ZEBRA_INTERFACE_ADDRESS_ADD,
! 184: zclient->ibuf);
! 185:
! 186: if (c == NULL)
! 187: return 0;
! 188:
! 189: p = c->address;
! 190:
! 191: prefix2str (p, buf, BUFSIZ);
! 192: #ifdef EXTREME_DEBUG
! 193: if (p->family == AF_INET)
! 194: zlog_debug ("connected IP address %s", buf);
! 195: #ifdef HAVE_IPV6
! 196: if (p->family == AF_INET6)
! 197: zlog_debug ("connected IPv6 address %s", buf);
! 198: #endif /* HAVE_IPV6 */
! 199: #endif /* EXTREME_DEBUG */
! 200: if (if_is_operative (c->ifp))
! 201: isis_circuit_add_addr (circuit_scan_by_ifp (c->ifp), c);
! 202:
! 203: return 0;
! 204: }
! 205:
! 206: static int
! 207: isis_zebra_if_address_del (int command, struct zclient *client,
! 208: zebra_size_t length)
! 209: {
! 210: struct connected *c;
! 211: struct interface *ifp;
! 212: #ifdef EXTREME_DEBUG
! 213: struct prefix *p;
! 214: u_char buf[BUFSIZ];
! 215: #endif /* EXTREME_DEBUG */
! 216:
! 217: c = zebra_interface_address_read (ZEBRA_INTERFACE_ADDRESS_DELETE,
! 218: zclient->ibuf);
! 219:
! 220: if (c == NULL)
! 221: return 0;
! 222:
! 223: ifp = c->ifp;
! 224:
! 225: #ifdef EXTREME_DEBUG
! 226: p = c->address;
! 227: prefix2str (p, buf, BUFSIZ);
! 228:
! 229: if (p->family == AF_INET)
! 230: zlog_debug ("disconnected IP address %s", buf);
! 231: #ifdef HAVE_IPV6
! 232: if (p->family == AF_INET6)
! 233: zlog_debug ("disconnected IPv6 address %s", buf);
! 234: #endif /* HAVE_IPV6 */
! 235: #endif /* EXTREME_DEBUG */
! 236:
! 237: if (if_is_operative (ifp))
! 238: isis_circuit_del_addr (circuit_scan_by_ifp (ifp), c);
! 239: connected_free (c);
! 240:
! 241: return 0;
! 242: }
! 243:
! 244: static void
! 245: isis_zebra_route_add_ipv4 (struct prefix *prefix,
! 246: struct isis_route_info *route_info)
! 247: {
! 248: u_char message, flags;
! 249: int psize;
! 250: struct stream *stream;
! 251: struct isis_nexthop *nexthop;
! 252: struct listnode *node;
! 253:
! 254: if (CHECK_FLAG (route_info->flag, ISIS_ROUTE_FLAG_ZEBRA_SYNC))
! 255: return;
! 256:
! 257: if (zclient->redist[ZEBRA_ROUTE_ISIS])
! 258: {
! 259: message = 0;
! 260: flags = 0;
! 261:
! 262: SET_FLAG (message, ZAPI_MESSAGE_NEXTHOP);
! 263: SET_FLAG (message, ZAPI_MESSAGE_METRIC);
! 264: #if 0
! 265: SET_FLAG (message, ZAPI_MESSAGE_DISTANCE);
! 266: #endif
! 267:
! 268: stream = zclient->obuf;
! 269: stream_reset (stream);
! 270: zclient_create_header (stream, ZEBRA_IPV4_ROUTE_ADD);
! 271: /* type */
! 272: stream_putc (stream, ZEBRA_ROUTE_ISIS);
! 273: /* flags */
! 274: stream_putc (stream, flags);
! 275: /* message */
! 276: stream_putc (stream, message);
! 277: /* prefix information */
! 278: psize = PSIZE (prefix->prefixlen);
! 279: stream_putc (stream, prefix->prefixlen);
! 280: stream_write (stream, (u_char *) & prefix->u.prefix4, psize);
! 281:
! 282: stream_putc (stream, listcount (route_info->nexthops));
! 283:
! 284: /* Nexthop, ifindex, distance and metric information */
! 285: for (ALL_LIST_ELEMENTS_RO (route_info->nexthops, node, nexthop))
! 286: {
! 287: /* FIXME: can it be ? */
! 288: if (nexthop->ip.s_addr != INADDR_ANY)
! 289: {
! 290: stream_putc (stream, ZEBRA_NEXTHOP_IPV4);
! 291: stream_put_in_addr (stream, &nexthop->ip);
! 292: }
! 293: else
! 294: {
! 295: stream_putc (stream, ZEBRA_NEXTHOP_IFINDEX);
! 296: stream_putl (stream, nexthop->ifindex);
! 297: }
! 298: }
! 299: #if 0
! 300: if (CHECK_FLAG (message, ZAPI_MESSAGE_DISTANCE))
! 301: stream_putc (stream, route_info->depth);
! 302: #endif
! 303: if (CHECK_FLAG (message, ZAPI_MESSAGE_METRIC))
! 304: stream_putl (stream, route_info->cost);
! 305:
! 306: stream_putw_at (stream, 0, stream_get_endp (stream));
! 307: zclient_send_message(zclient);
! 308: SET_FLAG (route_info->flag, ISIS_ROUTE_FLAG_ZEBRA_SYNC);
! 309: }
! 310: }
! 311:
! 312: static void
! 313: isis_zebra_route_del_ipv4 (struct prefix *prefix,
! 314: struct isis_route_info *route_info)
! 315: {
! 316: struct zapi_ipv4 api;
! 317: struct prefix_ipv4 prefix4;
! 318:
! 319: if (zclient->redist[ZEBRA_ROUTE_ISIS])
! 320: {
! 321: api.type = ZEBRA_ROUTE_ISIS;
! 322: api.flags = 0;
! 323: api.message = 0;
! 324: prefix4.family = AF_INET;
! 325: prefix4.prefixlen = prefix->prefixlen;
! 326: prefix4.prefix = prefix->u.prefix4;
! 327: zapi_ipv4_route (ZEBRA_IPV4_ROUTE_DELETE, zclient, &prefix4, &api);
! 328: }
! 329: UNSET_FLAG (route_info->flag, ISIS_ROUTE_FLAG_ZEBRA_SYNC);
! 330:
! 331: return;
! 332: }
! 333:
! 334: #ifdef HAVE_IPV6
! 335: void
! 336: isis_zebra_route_add_ipv6 (struct prefix *prefix,
! 337: struct isis_route_info *route_info)
! 338: {
! 339: struct zapi_ipv6 api;
! 340: struct in6_addr **nexthop_list;
! 341: unsigned int *ifindex_list;
! 342: struct isis_nexthop6 *nexthop6;
! 343: int i, size;
! 344: struct listnode *node;
! 345: struct prefix_ipv6 prefix6;
! 346:
! 347: if (CHECK_FLAG (route_info->flag, ISIS_ROUTE_FLAG_ZEBRA_SYNC))
! 348: return;
! 349:
! 350: api.type = ZEBRA_ROUTE_ISIS;
! 351: api.flags = 0;
! 352: api.message = 0;
! 353: SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP);
! 354: SET_FLAG (api.message, ZAPI_MESSAGE_IFINDEX);
! 355: SET_FLAG (api.message, ZAPI_MESSAGE_METRIC);
! 356: api.metric = route_info->cost;
! 357: #if 0
! 358: SET_FLAG (api.message, ZAPI_MESSAGE_DISTANCE);
! 359: api.distance = route_info->depth;
! 360: #endif
! 361: api.nexthop_num = listcount (route_info->nexthops6);
! 362: api.ifindex_num = listcount (route_info->nexthops6);
! 363:
! 364: /* allocate memory for nexthop_list */
! 365: size = sizeof (struct isis_nexthop6 *) * listcount (route_info->nexthops6);
! 366: nexthop_list = (struct in6_addr **) XMALLOC (MTYPE_ISIS_TMP, size);
! 367: if (!nexthop_list)
! 368: {
! 369: zlog_err ("isis_zebra_add_route_ipv6: out of memory!");
! 370: return;
! 371: }
! 372:
! 373: /* allocate memory for ifindex_list */
! 374: size = sizeof (unsigned int) * listcount (route_info->nexthops6);
! 375: ifindex_list = (unsigned int *) XMALLOC (MTYPE_ISIS_TMP, size);
! 376: if (!ifindex_list)
! 377: {
! 378: zlog_err ("isis_zebra_add_route_ipv6: out of memory!");
! 379: XFREE (MTYPE_ISIS_TMP, nexthop_list);
! 380: return;
! 381: }
! 382:
! 383: /* for each nexthop */
! 384: i = 0;
! 385: for (ALL_LIST_ELEMENTS_RO (route_info->nexthops6, node, nexthop6))
! 386: {
! 387: if (!IN6_IS_ADDR_LINKLOCAL (&nexthop6->ip6) &&
! 388: !IN6_IS_ADDR_UNSPECIFIED (&nexthop6->ip6))
! 389: {
! 390: api.nexthop_num--;
! 391: api.ifindex_num--;
! 392: continue;
! 393: }
! 394:
! 395: nexthop_list[i] = &nexthop6->ip6;
! 396: ifindex_list[i] = nexthop6->ifindex;
! 397: i++;
! 398: }
! 399:
! 400: api.nexthop = nexthop_list;
! 401: api.ifindex = ifindex_list;
! 402:
! 403: if (api.nexthop_num && api.ifindex_num)
! 404: {
! 405: prefix6.family = AF_INET6;
! 406: prefix6.prefixlen = prefix->prefixlen;
! 407: memcpy (&prefix6.prefix, &prefix->u.prefix6, sizeof (struct in6_addr));
! 408: zapi_ipv6_route (ZEBRA_IPV6_ROUTE_ADD, zclient, &prefix6, &api);
! 409: SET_FLAG (route_info->flag, ISIS_ROUTE_FLAG_ZEBRA_SYNC);
! 410: }
! 411:
! 412: XFREE (MTYPE_ISIS_TMP, nexthop_list);
! 413: XFREE (MTYPE_ISIS_TMP, ifindex_list);
! 414:
! 415: return;
! 416: }
! 417:
! 418: static void
! 419: isis_zebra_route_del_ipv6 (struct prefix *prefix,
! 420: struct isis_route_info *route_info)
! 421: {
! 422: struct zapi_ipv6 api;
! 423: struct in6_addr **nexthop_list;
! 424: unsigned int *ifindex_list;
! 425: struct isis_nexthop6 *nexthop6;
! 426: int i, size;
! 427: struct listnode *node;
! 428: struct prefix_ipv6 prefix6;
! 429:
! 430: if (CHECK_FLAG (route_info->flag, ISIS_ROUTE_FLAG_ZEBRA_SYNC))
! 431: return;
! 432:
! 433: api.type = ZEBRA_ROUTE_ISIS;
! 434: api.flags = 0;
! 435: api.message = 0;
! 436: SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP);
! 437: SET_FLAG (api.message, ZAPI_MESSAGE_IFINDEX);
! 438: api.nexthop_num = listcount (route_info->nexthops6);
! 439: api.ifindex_num = listcount (route_info->nexthops6);
! 440:
! 441: /* allocate memory for nexthop_list */
! 442: size = sizeof (struct isis_nexthop6 *) * listcount (route_info->nexthops6);
! 443: nexthop_list = (struct in6_addr **) XMALLOC (MTYPE_ISIS_TMP, size);
! 444: if (!nexthop_list)
! 445: {
! 446: zlog_err ("isis_zebra_route_del_ipv6: out of memory!");
! 447: return;
! 448: }
! 449:
! 450: /* allocate memory for ifindex_list */
! 451: size = sizeof (unsigned int) * listcount (route_info->nexthops6);
! 452: ifindex_list = (unsigned int *) XMALLOC (MTYPE_ISIS_TMP, size);
! 453: if (!ifindex_list)
! 454: {
! 455: zlog_err ("isis_zebra_route_del_ipv6: out of memory!");
! 456: XFREE (MTYPE_ISIS_TMP, nexthop_list);
! 457: return;
! 458: }
! 459:
! 460: /* for each nexthop */
! 461: i = 0;
! 462: for (ALL_LIST_ELEMENTS_RO (route_info->nexthops6, node, nexthop6))
! 463: {
! 464: if (!IN6_IS_ADDR_LINKLOCAL (&nexthop6->ip6) &&
! 465: !IN6_IS_ADDR_UNSPECIFIED (&nexthop6->ip6))
! 466: {
! 467: api.nexthop_num--;
! 468: api.ifindex_num--;
! 469: continue;
! 470: }
! 471:
! 472: nexthop_list[i] = &nexthop6->ip6;
! 473: ifindex_list[i] = nexthop6->ifindex;
! 474: i++;
! 475: }
! 476:
! 477: api.nexthop = nexthop_list;
! 478: api.ifindex = ifindex_list;
! 479:
! 480: if (api.nexthop_num && api.ifindex_num)
! 481: {
! 482: prefix6.family = AF_INET6;
! 483: prefix6.prefixlen = prefix->prefixlen;
! 484: memcpy (&prefix6.prefix, &prefix->u.prefix6, sizeof (struct in6_addr));
! 485: zapi_ipv6_route (ZEBRA_IPV6_ROUTE_DELETE, zclient, &prefix6, &api);
! 486: UNSET_FLAG (route_info->flag, ISIS_ROUTE_FLAG_ZEBRA_SYNC);
! 487: }
! 488:
! 489: XFREE (MTYPE_ISIS_TMP, nexthop_list);
! 490: XFREE (MTYPE_ISIS_TMP, ifindex_list);
! 491: }
! 492:
! 493: #endif /* HAVE_IPV6 */
! 494:
! 495: void
! 496: isis_zebra_route_update (struct prefix *prefix,
! 497: struct isis_route_info *route_info)
! 498: {
! 499: if (zclient->sock < 0)
! 500: return;
! 501:
! 502: if (!zclient->redist[ZEBRA_ROUTE_ISIS])
! 503: return;
! 504:
! 505: if (CHECK_FLAG (route_info->flag, ISIS_ROUTE_FLAG_ACTIVE))
! 506: {
! 507: if (prefix->family == AF_INET)
! 508: isis_zebra_route_add_ipv4 (prefix, route_info);
! 509: #ifdef HAVE_IPV6
! 510: else if (prefix->family == AF_INET6)
! 511: isis_zebra_route_add_ipv6 (prefix, route_info);
! 512: #endif /* HAVE_IPV6 */
! 513: }
! 514: else
! 515: {
! 516: if (prefix->family == AF_INET)
! 517: isis_zebra_route_del_ipv4 (prefix, route_info);
! 518: #ifdef HAVE_IPV6
! 519: else if (prefix->family == AF_INET6)
! 520: isis_zebra_route_del_ipv6 (prefix, route_info);
! 521: #endif /* HAVE_IPV6 */
! 522: }
! 523: return;
! 524: }
! 525:
! 526: static int
! 527: isis_zebra_read_ipv4 (int command, struct zclient *zclient,
! 528: zebra_size_t length)
! 529: {
! 530: struct stream *stream;
! 531: struct zapi_ipv4 api;
! 532: struct prefix_ipv4 p;
! 533: unsigned long ifindex;
! 534: struct in_addr nexthop;
! 535:
! 536: stream = zclient->ibuf;
! 537: memset (&p, 0, sizeof (struct prefix_ipv4));
! 538: ifindex = 0;
! 539:
! 540: api.type = stream_getc (stream);
! 541: api.flags = stream_getc (stream);
! 542: api.message = stream_getc (stream);
! 543:
! 544: p.family = AF_INET;
! 545: p.prefixlen = stream_getc (stream);
! 546: stream_get (&p.prefix, stream, PSIZE (p.prefixlen));
! 547:
! 548: if (CHECK_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP))
! 549: {
! 550: api.nexthop_num = stream_getc (stream);
! 551: nexthop.s_addr = stream_get_ipv4 (stream);
! 552: }
! 553: if (CHECK_FLAG (api.message, ZAPI_MESSAGE_IFINDEX))
! 554: {
! 555: api.ifindex_num = stream_getc (stream);
! 556: ifindex = stream_getl (stream);
! 557: }
! 558: if (CHECK_FLAG (api.message, ZAPI_MESSAGE_DISTANCE))
! 559: api.distance = stream_getc (stream);
! 560: if (CHECK_FLAG (api.message, ZAPI_MESSAGE_METRIC))
! 561: api.metric = stream_getl (stream);
! 562: else
! 563: api.metric = 0;
! 564:
! 565: if (command == ZEBRA_IPV4_ROUTE_ADD)
! 566: {
! 567: if (isis->debugs & DEBUG_ZEBRA)
! 568: zlog_debug ("IPv4 Route add from Z");
! 569: }
! 570:
! 571: return 0;
! 572: }
! 573:
! 574: #ifdef HAVE_IPV6
! 575: static int
! 576: isis_zebra_read_ipv6 (int command, struct zclient *zclient,
! 577: zebra_size_t length)
! 578: {
! 579: return 0;
! 580: }
! 581: #endif
! 582:
! 583: #define ISIS_TYPE_IS_REDISTRIBUTED(T) \
! 584: T == ZEBRA_ROUTE_MAX ? zclient->default_information : zclient->redist[type]
! 585:
! 586: int
! 587: isis_distribute_list_update (int routetype)
! 588: {
! 589: return 0;
! 590: }
! 591:
! 592: #if 0 /* Not yet. */
! 593: static int
! 594: isis_redistribute_default_set (int routetype, int metric_type,
! 595: int metric_value)
! 596: {
! 597: return 0;
! 598: }
! 599: #endif /* 0 */
! 600:
! 601: void
! 602: isis_zebra_init ()
! 603: {
! 604: zclient = zclient_new ();
! 605: zclient_init (zclient, ZEBRA_ROUTE_ISIS);
! 606: zclient->router_id_update = isis_router_id_update_zebra;
! 607: zclient->interface_add = isis_zebra_if_add;
! 608: zclient->interface_delete = isis_zebra_if_del;
! 609: zclient->interface_up = isis_zebra_if_state_up;
! 610: zclient->interface_down = isis_zebra_if_state_down;
! 611: zclient->interface_address_add = isis_zebra_if_address_add;
! 612: zclient->interface_address_delete = isis_zebra_if_address_del;
! 613: zclient->ipv4_route_add = isis_zebra_read_ipv4;
! 614: zclient->ipv4_route_delete = isis_zebra_read_ipv4;
! 615: #ifdef HAVE_IPV6
! 616: zclient->ipv6_route_add = isis_zebra_read_ipv6;
! 617: zclient->ipv6_route_delete = isis_zebra_read_ipv6;
! 618: #endif /* HAVE_IPV6 */
! 619:
! 620: return;
! 621: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>