Annotation of embedaddon/quagga/ripd/rip_zebra.c, revision 1.1
1.1 ! misho 1: /* RIPd and zebra interface.
! 2: * Copyright (C) 1997, 1999 Kunihiro Ishiguro <kunihiro@zebra.org>
! 3: *
! 4: * This file is part of GNU Zebra.
! 5: *
! 6: * GNU Zebra is free software; you can redistribute it and/or modify it
! 7: * under the terms of the GNU General Public License as published by the
! 8: * Free Software Foundation; either version 2, or (at your option) any
! 9: * later version.
! 10: *
! 11: * GNU Zebra is distributed in the hope that it will be useful, but
! 12: * WITHOUT ANY WARRANTY; without even the implied warranty of
! 13: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
! 14: * General Public License for more details.
! 15: *
! 16: * You should have received a copy of the GNU General Public License
! 17: * along with GNU Zebra; see the file COPYING. If not, write to the Free
! 18: * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
! 19: * 02111-1307, USA.
! 20: */
! 21:
! 22: #include <zebra.h>
! 23:
! 24: #include "command.h"
! 25: #include "prefix.h"
! 26: #include "stream.h"
! 27: #include "routemap.h"
! 28: #include "zclient.h"
! 29: #include "log.h"
! 30: #include "ripd/ripd.h"
! 31: #include "ripd/rip_debug.h"
! 32: #include "ripd/rip_interface.h"
! 33:
! 34: /* All information about zebra. */
! 35: struct zclient *zclient = NULL;
! 36:
! 37: /* RIPd to zebra command interface. */
! 38: void
! 39: rip_zebra_ipv4_add (struct prefix_ipv4 *p, struct in_addr *nexthop,
! 40: u_int32_t metric, u_char distance)
! 41: {
! 42: struct zapi_ipv4 api;
! 43:
! 44: if (zclient->redist[ZEBRA_ROUTE_RIP])
! 45: {
! 46: api.type = ZEBRA_ROUTE_RIP;
! 47: api.flags = 0;
! 48: api.message = 0;
! 49: SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP);
! 50: api.nexthop_num = 1;
! 51: api.nexthop = &nexthop;
! 52: api.ifindex_num = 0;
! 53: SET_FLAG (api.message, ZAPI_MESSAGE_METRIC);
! 54: api.metric = metric;
! 55:
! 56: if (distance && distance != ZEBRA_RIP_DISTANCE_DEFAULT)
! 57: {
! 58: SET_FLAG (api.message, ZAPI_MESSAGE_DISTANCE);
! 59: api.distance = distance;
! 60: }
! 61:
! 62: zapi_ipv4_route (ZEBRA_IPV4_ROUTE_ADD, zclient, p, &api);
! 63:
! 64: rip_global_route_changes++;
! 65: }
! 66: }
! 67:
! 68: void
! 69: rip_zebra_ipv4_delete (struct prefix_ipv4 *p, struct in_addr *nexthop,
! 70: u_int32_t metric)
! 71: {
! 72: struct zapi_ipv4 api;
! 73:
! 74: if (zclient->redist[ZEBRA_ROUTE_RIP])
! 75: {
! 76: api.type = ZEBRA_ROUTE_RIP;
! 77: api.flags = 0;
! 78: api.message = 0;
! 79: SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP);
! 80: api.nexthop_num = 1;
! 81: api.nexthop = &nexthop;
! 82: api.ifindex_num = 0;
! 83: SET_FLAG (api.message, ZAPI_MESSAGE_METRIC);
! 84: api.metric = metric;
! 85:
! 86: zapi_ipv4_route (ZEBRA_IPV4_ROUTE_DELETE, zclient, p, &api);
! 87:
! 88: rip_global_route_changes++;
! 89: }
! 90: }
! 91:
! 92: /* Zebra route add and delete treatment. */
! 93: static int
! 94: rip_zebra_read_ipv4 (int command, struct zclient *zclient, zebra_size_t length)
! 95: {
! 96: struct stream *s;
! 97: struct zapi_ipv4 api;
! 98: unsigned long ifindex;
! 99: struct in_addr nexthop;
! 100: struct prefix_ipv4 p;
! 101:
! 102: s = zclient->ibuf;
! 103: ifindex = 0;
! 104: nexthop.s_addr = 0;
! 105:
! 106: /* Type, flags, message. */
! 107: api.type = stream_getc (s);
! 108: api.flags = stream_getc (s);
! 109: api.message = stream_getc (s);
! 110:
! 111: /* IPv4 prefix. */
! 112: memset (&p, 0, sizeof (struct prefix_ipv4));
! 113: p.family = AF_INET;
! 114: p.prefixlen = stream_getc (s);
! 115: stream_get (&p.prefix, s, PSIZE (p.prefixlen));
! 116:
! 117: /* Nexthop, ifindex, distance, metric. */
! 118: if (CHECK_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP))
! 119: {
! 120: api.nexthop_num = stream_getc (s);
! 121: nexthop.s_addr = stream_get_ipv4 (s);
! 122: }
! 123: if (CHECK_FLAG (api.message, ZAPI_MESSAGE_IFINDEX))
! 124: {
! 125: api.ifindex_num = stream_getc (s);
! 126: ifindex = stream_getl (s);
! 127: }
! 128: if (CHECK_FLAG (api.message, ZAPI_MESSAGE_DISTANCE))
! 129: api.distance = stream_getc (s);
! 130: else
! 131: api.distance = 255;
! 132: if (CHECK_FLAG (api.message, ZAPI_MESSAGE_METRIC))
! 133: api.metric = stream_getl (s);
! 134: else
! 135: api.metric = 0;
! 136:
! 137: /* Then fetch IPv4 prefixes. */
! 138: if (command == ZEBRA_IPV4_ROUTE_ADD)
! 139: rip_redistribute_add (api.type, RIP_ROUTE_REDISTRIBUTE, &p, ifindex,
! 140: &nexthop, api.metric, api.distance);
! 141: else
! 142: rip_redistribute_delete (api.type, RIP_ROUTE_REDISTRIBUTE, &p, ifindex);
! 143:
! 144: return 0;
! 145: }
! 146:
! 147: void
! 148: rip_zclient_reset (void)
! 149: {
! 150: zclient_reset (zclient);
! 151: }
! 152:
! 153: /* RIP route-map set for redistribution */
! 154: static void
! 155: rip_routemap_set (int type, const char *name)
! 156: {
! 157: if (rip->route_map[type].name)
! 158: free(rip->route_map[type].name);
! 159:
! 160: rip->route_map[type].name = strdup (name);
! 161: rip->route_map[type].map = route_map_lookup_by_name (name);
! 162: }
! 163:
! 164: static void
! 165: rip_redistribute_metric_set (int type, unsigned int metric)
! 166: {
! 167: rip->route_map[type].metric_config = 1;
! 168: rip->route_map[type].metric = metric;
! 169: }
! 170:
! 171: static int
! 172: rip_metric_unset (int type, unsigned int metric)
! 173: {
! 174: #define DONT_CARE_METRIC_RIP 17
! 175: if (metric != DONT_CARE_METRIC_RIP &&
! 176: rip->route_map[type].metric != metric)
! 177: return 1;
! 178: rip->route_map[type].metric_config = 0;
! 179: rip->route_map[type].metric = 0;
! 180: return 0;
! 181: }
! 182:
! 183: /* RIP route-map unset for redistribution */
! 184: static int
! 185: rip_routemap_unset (int type, const char *name)
! 186: {
! 187: if (! rip->route_map[type].name ||
! 188: (name != NULL && strcmp(rip->route_map[type].name,name)))
! 189: return 1;
! 190:
! 191: free (rip->route_map[type].name);
! 192: rip->route_map[type].name = NULL;
! 193: rip->route_map[type].map = NULL;
! 194:
! 195: return 0;
! 196: }
! 197:
! 198: /* Redistribution types */
! 199: static struct {
! 200: int type;
! 201: int str_min_len;
! 202: const char *str;
! 203: } redist_type[] = {
! 204: {ZEBRA_ROUTE_KERNEL, 1, "kernel"},
! 205: {ZEBRA_ROUTE_CONNECT, 1, "connected"},
! 206: {ZEBRA_ROUTE_STATIC, 1, "static"},
! 207: {ZEBRA_ROUTE_OSPF, 1, "ospf"},
! 208: {ZEBRA_ROUTE_BGP, 1, "bgp"},
! 209: {0, 0, NULL}
! 210: };
! 211:
! 212: DEFUN (router_zebra,
! 213: router_zebra_cmd,
! 214: "router zebra",
! 215: "Enable a routing process\n"
! 216: "Make connection to zebra daemon\n")
! 217: {
! 218: vty->node = ZEBRA_NODE;
! 219: zclient->enable = 1;
! 220: zclient_start (zclient);
! 221: return CMD_SUCCESS;
! 222: }
! 223:
! 224: DEFUN (no_router_zebra,
! 225: no_router_zebra_cmd,
! 226: "no router zebra",
! 227: NO_STR
! 228: "Enable a routing process\n"
! 229: "Make connection to zebra daemon\n")
! 230: {
! 231: zclient->enable = 0;
! 232: zclient_stop (zclient);
! 233: return CMD_SUCCESS;
! 234: }
! 235:
! 236: #if 0
! 237: static int
! 238: rip_redistribute_set (int type)
! 239: {
! 240: if (zclient->redist[type])
! 241: return CMD_SUCCESS;
! 242:
! 243: zclient->redist[type] = 1;
! 244:
! 245: if (zclient->sock > 0)
! 246: zebra_redistribute_send (ZEBRA_REDISTRIBUTE_ADD, zclient, type);
! 247:
! 248: return CMD_SUCCESS;
! 249: }
! 250: #endif
! 251:
! 252: static int
! 253: rip_redistribute_unset (int type)
! 254: {
! 255: if (! zclient->redist[type])
! 256: return CMD_SUCCESS;
! 257:
! 258: zclient->redist[type] = 0;
! 259:
! 260: if (zclient->sock > 0)
! 261: zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE, zclient, type);
! 262:
! 263: /* Remove the routes from RIP table. */
! 264: rip_redistribute_withdraw (type);
! 265:
! 266: return CMD_SUCCESS;
! 267: }
! 268:
! 269: int
! 270: rip_redistribute_check (int type)
! 271: {
! 272: return (zclient->redist[type]);
! 273: }
! 274:
! 275: void
! 276: rip_redistribute_clean (void)
! 277: {
! 278: int i;
! 279:
! 280: for (i = 0; redist_type[i].str; i++)
! 281: {
! 282: if (zclient->redist[redist_type[i].type])
! 283: {
! 284: if (zclient->sock > 0)
! 285: zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE,
! 286: zclient, redist_type[i].type);
! 287:
! 288: zclient->redist[redist_type[i].type] = 0;
! 289:
! 290: /* Remove the routes from RIP table. */
! 291: rip_redistribute_withdraw (redist_type[i].type);
! 292: }
! 293: }
! 294: }
! 295:
! 296: DEFUN (rip_redistribute_rip,
! 297: rip_redistribute_rip_cmd,
! 298: "redistribute rip",
! 299: "Redistribute information from another routing protocol\n"
! 300: "Routing Information Protocol (RIP)\n")
! 301: {
! 302: zclient->redist[ZEBRA_ROUTE_RIP] = 1;
! 303: return CMD_SUCCESS;
! 304: }
! 305:
! 306: DEFUN (no_rip_redistribute_rip,
! 307: no_rip_redistribute_rip_cmd,
! 308: "no redistribute rip",
! 309: NO_STR
! 310: "Redistribute information from another routing protocol\n"
! 311: "Routing Information Protocol (RIP)\n")
! 312: {
! 313: zclient->redist[ZEBRA_ROUTE_RIP] = 0;
! 314: return CMD_SUCCESS;
! 315: }
! 316:
! 317: DEFUN (rip_redistribute_type,
! 318: rip_redistribute_type_cmd,
! 319: "redistribute " QUAGGA_REDIST_STR_RIPD,
! 320: REDIST_STR
! 321: QUAGGA_REDIST_HELP_STR_RIPD)
! 322: {
! 323: int i;
! 324:
! 325: for(i = 0; redist_type[i].str; i++)
! 326: {
! 327: if (strncmp (redist_type[i].str, argv[0],
! 328: redist_type[i].str_min_len) == 0)
! 329: {
! 330: zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient,
! 331: redist_type[i].type);
! 332: return CMD_SUCCESS;
! 333: }
! 334: }
! 335:
! 336: vty_out(vty, "Invalid type %s%s", argv[0],
! 337: VTY_NEWLINE);
! 338:
! 339: return CMD_WARNING;
! 340: }
! 341:
! 342: DEFUN (no_rip_redistribute_type,
! 343: no_rip_redistribute_type_cmd,
! 344: "no redistribute " QUAGGA_REDIST_STR_RIPD,
! 345: NO_STR
! 346: REDIST_STR
! 347: QUAGGA_REDIST_HELP_STR_RIPD)
! 348: {
! 349: int i;
! 350:
! 351: for (i = 0; redist_type[i].str; i++)
! 352: {
! 353: if (strncmp(redist_type[i].str, argv[0],
! 354: redist_type[i].str_min_len) == 0)
! 355: {
! 356: rip_metric_unset (redist_type[i].type, DONT_CARE_METRIC_RIP);
! 357: rip_routemap_unset (redist_type[i].type,NULL);
! 358: rip_redistribute_unset (redist_type[i].type);
! 359: return CMD_SUCCESS;
! 360: }
! 361: }
! 362:
! 363: vty_out(vty, "Invalid type %s%s", argv[0],
! 364: VTY_NEWLINE);
! 365:
! 366: return CMD_WARNING;
! 367: }
! 368:
! 369: DEFUN (rip_redistribute_type_routemap,
! 370: rip_redistribute_type_routemap_cmd,
! 371: "redistribute " QUAGGA_REDIST_STR_RIPD " route-map WORD",
! 372: REDIST_STR
! 373: QUAGGA_REDIST_HELP_STR_RIPD
! 374: "Route map reference\n"
! 375: "Pointer to route-map entries\n")
! 376: {
! 377: int i;
! 378:
! 379: for (i = 0; redist_type[i].str; i++) {
! 380: if (strncmp(redist_type[i].str, argv[0],
! 381: redist_type[i].str_min_len) == 0)
! 382: {
! 383: rip_routemap_set (redist_type[i].type, argv[1]);
! 384: zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, redist_type[i].type);
! 385: return CMD_SUCCESS;
! 386: }
! 387: }
! 388:
! 389: vty_out(vty, "Invalid type %s%s", argv[0],
! 390: VTY_NEWLINE);
! 391:
! 392: return CMD_WARNING;
! 393: }
! 394:
! 395: DEFUN (no_rip_redistribute_type_routemap,
! 396: no_rip_redistribute_type_routemap_cmd,
! 397: "no redistribute " QUAGGA_REDIST_STR_RIPD " route-map WORD",
! 398: NO_STR
! 399: REDIST_STR
! 400: QUAGGA_REDIST_HELP_STR_RIPD
! 401: "Route map reference\n"
! 402: "Pointer to route-map entries\n")
! 403: {
! 404: int i;
! 405:
! 406: for (i = 0; redist_type[i].str; i++)
! 407: {
! 408: if (strncmp(redist_type[i].str, argv[0],
! 409: redist_type[i].str_min_len) == 0)
! 410: {
! 411: if (rip_routemap_unset (redist_type[i].type,argv[1]))
! 412: return CMD_WARNING;
! 413: rip_redistribute_unset (redist_type[i].type);
! 414: return CMD_SUCCESS;
! 415: }
! 416: }
! 417:
! 418: vty_out(vty, "Invalid type %s%s", argv[0],
! 419: VTY_NEWLINE);
! 420:
! 421: return CMD_WARNING;
! 422: }
! 423:
! 424: DEFUN (rip_redistribute_type_metric,
! 425: rip_redistribute_type_metric_cmd,
! 426: "redistribute " QUAGGA_REDIST_STR_RIPD " metric <0-16>",
! 427: REDIST_STR
! 428: QUAGGA_REDIST_HELP_STR_RIPD
! 429: "Metric\n"
! 430: "Metric value\n")
! 431: {
! 432: int i;
! 433: int metric;
! 434:
! 435: metric = atoi (argv[1]);
! 436:
! 437: for (i = 0; redist_type[i].str; i++) {
! 438: if (strncmp(redist_type[i].str, argv[0],
! 439: redist_type[i].str_min_len) == 0)
! 440: {
! 441: rip_redistribute_metric_set (redist_type[i].type, metric);
! 442: zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, redist_type[i].type);
! 443: return CMD_SUCCESS;
! 444: }
! 445: }
! 446:
! 447: vty_out(vty, "Invalid type %s%s", argv[0],
! 448: VTY_NEWLINE);
! 449:
! 450: return CMD_WARNING;
! 451: }
! 452:
! 453: DEFUN (no_rip_redistribute_type_metric,
! 454: no_rip_redistribute_type_metric_cmd,
! 455: "no redistribute " QUAGGA_REDIST_STR_RIPD " metric <0-16>",
! 456: NO_STR
! 457: REDIST_STR
! 458: QUAGGA_REDIST_HELP_STR_RIPD
! 459: "Metric\n"
! 460: "Metric value\n")
! 461: {
! 462: int i;
! 463:
! 464: for (i = 0; redist_type[i].str; i++)
! 465: {
! 466: if (strncmp(redist_type[i].str, argv[0],
! 467: redist_type[i].str_min_len) == 0)
! 468: {
! 469: if (rip_metric_unset (redist_type[i].type, atoi(argv[1])))
! 470: return CMD_WARNING;
! 471: rip_redistribute_unset (redist_type[i].type);
! 472: return CMD_SUCCESS;
! 473: }
! 474: }
! 475:
! 476: vty_out(vty, "Invalid type %s%s", argv[0],
! 477: VTY_NEWLINE);
! 478:
! 479: return CMD_WARNING;
! 480: }
! 481:
! 482: DEFUN (rip_redistribute_type_metric_routemap,
! 483: rip_redistribute_type_metric_routemap_cmd,
! 484: "redistribute " QUAGGA_REDIST_STR_RIPD " metric <0-16> route-map WORD",
! 485: REDIST_STR
! 486: QUAGGA_REDIST_HELP_STR_RIPD
! 487: "Metric\n"
! 488: "Metric value\n"
! 489: "Route map reference\n"
! 490: "Pointer to route-map entries\n")
! 491: {
! 492: int i;
! 493: int metric;
! 494:
! 495: metric = atoi (argv[1]);
! 496:
! 497: for (i = 0; redist_type[i].str; i++) {
! 498: if (strncmp(redist_type[i].str, argv[0],
! 499: redist_type[i].str_min_len) == 0)
! 500: {
! 501: rip_redistribute_metric_set (redist_type[i].type, metric);
! 502: rip_routemap_set (redist_type[i].type, argv[2]);
! 503: zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, redist_type[i].type);
! 504: return CMD_SUCCESS;
! 505: }
! 506: }
! 507:
! 508: vty_out(vty, "Invalid type %s%s", argv[0],
! 509: VTY_NEWLINE);
! 510:
! 511: return CMD_WARNING;
! 512: }
! 513:
! 514:
! 515: DEFUN (no_rip_redistribute_type_metric_routemap,
! 516: no_rip_redistribute_type_metric_routemap_cmd,
! 517: "no redistribute " QUAGGA_REDIST_STR_RIPD
! 518: " metric <0-16> route-map WORD",
! 519: NO_STR
! 520: REDIST_STR
! 521: QUAGGA_REDIST_HELP_STR_RIPD
! 522: "Metric\n"
! 523: "Metric value\n"
! 524: "Route map reference\n"
! 525: "Pointer to route-map entries\n")
! 526: {
! 527: int i;
! 528:
! 529: for (i = 0; redist_type[i].str; i++)
! 530: {
! 531: if (strncmp(redist_type[i].str, argv[0],
! 532: redist_type[i].str_min_len) == 0)
! 533: {
! 534: if (rip_metric_unset (redist_type[i].type, atoi(argv[1])))
! 535: return CMD_WARNING;
! 536: if (rip_routemap_unset (redist_type[i].type, argv[2]))
! 537: {
! 538: rip_redistribute_metric_set(redist_type[i].type, atoi(argv[1]));
! 539: return CMD_WARNING;
! 540: }
! 541: rip_redistribute_unset (redist_type[i].type);
! 542: return CMD_SUCCESS;
! 543: }
! 544: }
! 545:
! 546: vty_out(vty, "Invalid type %s%s", argv[0],
! 547: VTY_NEWLINE);
! 548:
! 549: return CMD_WARNING;
! 550: }
! 551:
! 552: /* Default information originate. */
! 553:
! 554: DEFUN (rip_default_information_originate,
! 555: rip_default_information_originate_cmd,
! 556: "default-information originate",
! 557: "Control distribution of default route\n"
! 558: "Distribute a default route\n")
! 559: {
! 560: struct prefix_ipv4 p;
! 561:
! 562: if (! rip->default_information)
! 563: {
! 564: memset (&p, 0, sizeof (struct prefix_ipv4));
! 565: p.family = AF_INET;
! 566:
! 567: rip->default_information = 1;
! 568:
! 569: rip_redistribute_add (ZEBRA_ROUTE_RIP, RIP_ROUTE_DEFAULT, &p, 0,
! 570: NULL, 0, 0);
! 571: }
! 572:
! 573: return CMD_SUCCESS;
! 574: }
! 575:
! 576: DEFUN (no_rip_default_information_originate,
! 577: no_rip_default_information_originate_cmd,
! 578: "no default-information originate",
! 579: NO_STR
! 580: "Control distribution of default route\n"
! 581: "Distribute a default route\n")
! 582: {
! 583: struct prefix_ipv4 p;
! 584:
! 585: if (rip->default_information)
! 586: {
! 587: memset (&p, 0, sizeof (struct prefix_ipv4));
! 588: p.family = AF_INET;
! 589:
! 590: rip->default_information = 0;
! 591:
! 592: rip_redistribute_delete (ZEBRA_ROUTE_RIP, RIP_ROUTE_DEFAULT, &p, 0);
! 593: }
! 594:
! 595: return CMD_SUCCESS;
! 596: }
! 597:
! 598: /* RIP configuration write function. */
! 599: static int
! 600: config_write_zebra (struct vty *vty)
! 601: {
! 602: if (! zclient->enable)
! 603: {
! 604: vty_out (vty, "no router zebra%s", VTY_NEWLINE);
! 605: return 1;
! 606: }
! 607: else if (! zclient->redist[ZEBRA_ROUTE_RIP])
! 608: {
! 609: vty_out (vty, "router zebra%s", VTY_NEWLINE);
! 610: vty_out (vty, " no redistribute rip%s", VTY_NEWLINE);
! 611: return 1;
! 612: }
! 613: return 0;
! 614: }
! 615:
! 616: int
! 617: config_write_rip_redistribute (struct vty *vty, int config_mode)
! 618: {
! 619: int i;
! 620:
! 621: for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
! 622: if (i != zclient->redist_default && zclient->redist[i])
! 623: {
! 624: if (config_mode)
! 625: {
! 626: if (rip->route_map[i].metric_config)
! 627: {
! 628: if (rip->route_map[i].name)
! 629: vty_out (vty, " redistribute %s metric %d route-map %s%s",
! 630: zebra_route_string(i), rip->route_map[i].metric,
! 631: rip->route_map[i].name,
! 632: VTY_NEWLINE);
! 633: else
! 634: vty_out (vty, " redistribute %s metric %d%s",
! 635: zebra_route_string(i), rip->route_map[i].metric,
! 636: VTY_NEWLINE);
! 637: }
! 638: else
! 639: {
! 640: if (rip->route_map[i].name)
! 641: vty_out (vty, " redistribute %s route-map %s%s",
! 642: zebra_route_string(i), rip->route_map[i].name,
! 643: VTY_NEWLINE);
! 644: else
! 645: vty_out (vty, " redistribute %s%s", zebra_route_string(i),
! 646: VTY_NEWLINE);
! 647: }
! 648: }
! 649: else
! 650: vty_out (vty, " %s", zebra_route_string(i));
! 651: }
! 652: return 0;
! 653: }
! 654:
! 655: /* Zebra node structure. */
! 656: static struct cmd_node zebra_node =
! 657: {
! 658: ZEBRA_NODE,
! 659: "%s(config-router)# ",
! 660: };
! 661:
! 662: void
! 663: rip_zclient_init ()
! 664: {
! 665: /* Set default value to the zebra client structure. */
! 666: zclient = zclient_new ();
! 667: zclient_init (zclient, ZEBRA_ROUTE_RIP);
! 668: zclient->interface_add = rip_interface_add;
! 669: zclient->interface_delete = rip_interface_delete;
! 670: zclient->interface_address_add = rip_interface_address_add;
! 671: zclient->interface_address_delete = rip_interface_address_delete;
! 672: zclient->ipv4_route_add = rip_zebra_read_ipv4;
! 673: zclient->ipv4_route_delete = rip_zebra_read_ipv4;
! 674: zclient->interface_up = rip_interface_up;
! 675: zclient->interface_down = rip_interface_down;
! 676:
! 677: /* Install zebra node. */
! 678: install_node (&zebra_node, config_write_zebra);
! 679:
! 680: /* Install command elements to zebra node. */
! 681: install_element (CONFIG_NODE, &router_zebra_cmd);
! 682: install_element (CONFIG_NODE, &no_router_zebra_cmd);
! 683: install_default (ZEBRA_NODE);
! 684: install_element (ZEBRA_NODE, &rip_redistribute_rip_cmd);
! 685: install_element (ZEBRA_NODE, &no_rip_redistribute_rip_cmd);
! 686:
! 687: /* Install command elements to rip node. */
! 688: install_element (RIP_NODE, &rip_redistribute_type_cmd);
! 689: install_element (RIP_NODE, &rip_redistribute_type_routemap_cmd);
! 690: install_element (RIP_NODE, &rip_redistribute_type_metric_cmd);
! 691: install_element (RIP_NODE, &rip_redistribute_type_metric_routemap_cmd);
! 692: install_element (RIP_NODE, &no_rip_redistribute_type_cmd);
! 693: install_element (RIP_NODE, &no_rip_redistribute_type_routemap_cmd);
! 694: install_element (RIP_NODE, &no_rip_redistribute_type_metric_cmd);
! 695: install_element (RIP_NODE, &no_rip_redistribute_type_metric_routemap_cmd);
! 696: install_element (RIP_NODE, &rip_default_information_originate_cmd);
! 697: install_element (RIP_NODE, &no_rip_default_information_originate_cmd);
! 698: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>