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