rip_zebra.c
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:18k
源码类别:

网络

开发平台:

Unix_Linux

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