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

网络

开发平台:

Unix_Linux

  1. /*
  2.  * RIPngd and zebra interface.
  3.  * Copyright (C) 1998, 1999 Kunihiro Ishiguro
  4.  *
  5.  * This file is part of GNU Zebra.
  6.  *
  7.  * GNU Zebra is free software; you can redistribute it and/or modify it
  8.  * under the terms of the GNU General Public License as published by the
  9.  * Free Software Foundation; either version 2, or (at your option) any
  10.  * later version.
  11.  *
  12.  * GNU Zebra is distributed in the hope that it will be useful, but
  13.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15.  * General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU General Public License
  18.  * along with GNU Zebra; see the file COPYING.  If not, write to the Free
  19.  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  20.  * 02111-1307, USA.  
  21.  */
  22. #include <zebra.h>
  23. #include "command.h"
  24. #include "prefix.h"
  25. #include "stream.h"
  26. #include "routemap.h"
  27. #include "zclient.h"
  28. #include "log.h"
  29. #include "ripngd/ripngd.h"
  30. /* All information about zebra. */
  31. struct zclient *zclient = NULL;
  32. /* Callback prototypes for zebra client service. */
  33. int ripng_interface_up (int, struct zclient *, zebra_size_t);
  34. int ripng_interface_down (int, struct zclient *, zebra_size_t);
  35. int ripng_interface_add (int, struct zclient *, zebra_size_t);
  36. int ripng_interface_delete (int, struct zclient *, zebra_size_t);
  37. int ripng_interface_address_add (int, struct zclient *, zebra_size_t);
  38. int ripng_interface_address_delete (int, struct zclient *, zebra_size_t);
  39. void
  40. ripng_zebra_ipv6_add (struct prefix_ipv6 *p, struct in6_addr *nexthop,
  41.       unsigned int ifindex)
  42. {
  43.   struct zapi_ipv6 api;
  44.   if (zclient->redist[ZEBRA_ROUTE_RIPNG])
  45.     {
  46.       api.type = ZEBRA_ROUTE_RIPNG;
  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.       SET_FLAG (api.message, ZAPI_MESSAGE_IFINDEX);
  53.       api.ifindex_num = 1;
  54.       api.ifindex = &ifindex;
  55.       zapi_ipv6_add (zclient, p, &api);
  56.     }
  57. }
  58. void
  59. ripng_zebra_ipv6_delete (struct prefix_ipv6 *p, struct in6_addr *nexthop,
  60.  unsigned int ifindex)
  61. {
  62.   struct zapi_ipv6 api;
  63.   if (zclient->redist[ZEBRA_ROUTE_RIPNG])
  64.     {
  65.       api.type = ZEBRA_ROUTE_RIPNG;
  66.       api.flags = 0;
  67.       api.message = 0;
  68.       SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP);
  69.       api.nexthop_num = 1;
  70.       api.nexthop = &nexthop;
  71.       SET_FLAG (api.message, ZAPI_MESSAGE_IFINDEX);
  72.       api.ifindex_num = 1;
  73.       api.ifindex = &ifindex;
  74.       zapi_ipv6_delete (zclient, p, &api);
  75.     }
  76. }
  77. /* Zebra route add and delete treatment. */
  78. int
  79. ripng_zebra_read_ipv6 (int command, struct zclient *zclient,
  80.        zebra_size_t length)
  81. {
  82.   struct stream *s;
  83.   struct zapi_ipv6 api;
  84.   unsigned long ifindex;
  85.   struct in6_addr nexthop;
  86.   struct prefix_ipv6 p;
  87.   s = zclient->ibuf;
  88.   ifindex = 0;
  89.   memset (&nexthop, 0, sizeof (struct in6_addr));
  90.   /* Type, flags, message. */
  91.   api.type = stream_getc (s);
  92.   api.flags = stream_getc (s);
  93.   api.message = stream_getc (s);
  94.   /* IPv6 prefix. */
  95.   memset (&p, 0, sizeof (struct prefix_ipv6));
  96.   p.family = AF_INET6;
  97.   p.prefixlen = stream_getc (s);
  98.   stream_get (&p.prefix, s, PSIZE (p.prefixlen));
  99.   /* Nexthop, ifindex, distance, metric. */
  100.   if (CHECK_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP))
  101.     {
  102.       api.nexthop_num = stream_getc (s);
  103.       stream_get (&nexthop, s, 16);
  104.     }
  105.   if (CHECK_FLAG (api.message, ZAPI_MESSAGE_IFINDEX))
  106.     {
  107.       api.ifindex_num = stream_getc (s);
  108.       ifindex = stream_getl (s);
  109.     }
  110.   if (CHECK_FLAG (api.message, ZAPI_MESSAGE_DISTANCE))
  111.     api.distance = stream_getc (s);
  112.   else
  113.     api.distance = 0;
  114.   if (CHECK_FLAG (api.message, ZAPI_MESSAGE_METRIC))
  115.     api.metric = stream_getl (s);
  116.   else
  117.     api.metric = 0;
  118.   if (command == ZEBRA_IPV6_ROUTE_ADD)
  119.     ripng_redistribute_add (api.type, 0, &p, ifindex);
  120.   else
  121.     ripng_redistribute_delete (api.type, 0, &p, ifindex);
  122.   return 0;
  123. }
  124. int
  125. ripng_redistribute_unset (int type)
  126. {
  127.   if (! zclient->redist[type])
  128.     return CMD_SUCCESS;
  129.   zclient->redist[type] = 0;
  130.   if (zclient->sock > 0)
  131.     zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE, zclient->sock, type);
  132.   ripng_redistribute_withdraw (type);
  133.   
  134.   return CMD_SUCCESS;
  135. }
  136. void
  137. ripng_redistribute_metric_set (int type, int metric)
  138. {
  139.   ripng->route_map[type].metric_config = 1;
  140.   ripng->route_map[type].metric = metric;
  141. }
  142. void
  143. ripng_redistribute_metric_unset (int type)
  144. {
  145.   ripng->route_map[type].metric_config = 0;
  146.   ripng->route_map[type].metric = 0;
  147. }
  148. void
  149. ripng_redistribute_routemap_set (int type, char *name)
  150. {
  151.   if (ripng->route_map[type].name)
  152.     free (ripng->route_map[type].name);
  153.   ripng->route_map[type].name = strdup (name);
  154.   ripng->route_map[type].map = route_map_lookup_by_name (name);
  155. }
  156. void
  157. ripng_redistribute_routemap_unset (int type)
  158. {
  159.   if (ripng->route_map[type].name)
  160.     free (ripng->route_map[type].name);
  161.   ripng->route_map[type].name = NULL;
  162.   ripng->route_map[type].map = NULL;
  163. }
  164. DEFUN (router_zebra,
  165.        router_zebra_cmd,
  166.        "router zebra",
  167.        "Enable a routing processn"
  168.        "Make connection to zebra daemonn")
  169. {
  170.   vty->node = ZEBRA_NODE;
  171.   zclient->enable = 1;
  172.   zclient_start (zclient);
  173.   return CMD_SUCCESS;
  174. }
  175. DEFUN (no_router_zebra,
  176.        no_router_zebra_cmd,
  177.        "no router zebra",
  178.        NO_STR
  179.        "Disable a routing processn"
  180.        "Stop connection to zebra daemonn")
  181. {
  182.   zclient->enable = 0;
  183.   zclient_stop (zclient);
  184.   return CMD_SUCCESS;
  185. }
  186. DEFUN (ripng_redistribute_ripng,
  187.        ripng_redistribute_ripng_cmd,
  188.        "redistribute ripng",
  189.        "Redistribute information from another routing protocoln"
  190.        "RIPng routen")
  191. {
  192.   zclient->redist[ZEBRA_ROUTE_RIPNG] = 1;
  193.   return CMD_SUCCESS;
  194. }
  195. DEFUN (no_ripng_redistribute_ripng,
  196.        no_ripng_redistribute_ripng_cmd,
  197.        "no redistribute ripng",
  198.        NO_STR
  199.        "Redistribute information from another routing protocoln"
  200.        "RIPng routen")
  201. {
  202.   zclient->redist[ZEBRA_ROUTE_RIPNG] = 0;
  203.   return CMD_SUCCESS;
  204. }
  205. DEFUN (ripng_redistribute_static,
  206.        ripng_redistribute_static_cmd,
  207.        "redistribute static",
  208.        "Redistribute information from another routing protocoln"
  209.        "Static routesn")
  210. {
  211.   zclient_redistribute_set (zclient, ZEBRA_ROUTE_STATIC);
  212.   return CMD_SUCCESS;
  213. }
  214. DEFUN (no_ripng_redistribute_static,
  215.        no_ripng_redistribute_static_cmd,
  216.        "no redistribute static",
  217.        NO_STR
  218.        "Redistribute information from another routing protocoln"
  219.        "Static routesn")
  220. {
  221.   ripng_redistribute_metric_unset (ZEBRA_ROUTE_STATIC);
  222.   ripng_redistribute_routemap_unset (ZEBRA_ROUTE_STATIC);
  223.   return ripng_redistribute_unset (ZEBRA_ROUTE_STATIC);
  224. }
  225. DEFUN (ripng_redistribute_kernel,
  226.        ripng_redistribute_kernel_cmd,
  227.        "redistribute kernel",
  228.        "Redistribute information from another routing protocoln"
  229.        "Kernel routesn")
  230. {
  231.   zclient_redistribute_set (zclient, ZEBRA_ROUTE_KERNEL);
  232.   return CMD_SUCCESS;
  233. }
  234. DEFUN (no_ripng_redistribute_kernel,
  235.        no_ripng_redistribute_kernel_cmd,
  236.        "no redistribute kernel",
  237.        NO_STR
  238.        "Redistribute information from another routing protocoln"
  239.        "Kernel routesn")
  240. {
  241.   ripng_redistribute_metric_unset (ZEBRA_ROUTE_KERNEL);
  242.   ripng_redistribute_routemap_unset (ZEBRA_ROUTE_KERNEL);
  243.   return ripng_redistribute_unset (ZEBRA_ROUTE_KERNEL);
  244. }
  245. DEFUN (ripng_redistribute_connected,
  246.        ripng_redistribute_connected_cmd,
  247.        "redistribute connected",
  248.        "Redistribute information from another routing protocoln"
  249.        "Connectedn")
  250. {
  251.   zclient_redistribute_set (zclient, ZEBRA_ROUTE_CONNECT);
  252.   return CMD_SUCCESS;
  253. }
  254. DEFUN (no_ripng_redistribute_connected,
  255.        no_ripng_redistribute_connected_cmd,
  256.        "no redistribute connected",
  257.        NO_STR
  258.        "Redistribute information from another routing protocoln"
  259.        "Connectedn")
  260. {
  261.   ripng_redistribute_metric_unset (ZEBRA_ROUTE_CONNECT);
  262.   ripng_redistribute_routemap_unset (ZEBRA_ROUTE_CONNECT);
  263.   return ripng_redistribute_unset (ZEBRA_ROUTE_CONNECT);
  264. }
  265. DEFUN (ripng_redistribute_bgp,
  266.        ripng_redistribute_bgp_cmd,
  267.        "redistribute bgp",
  268.        "Redistribute information from another routing protocoln"
  269.        "Border Gateway Protocol (BGP)n")
  270. {
  271.   zclient_redistribute_set (zclient, ZEBRA_ROUTE_BGP);
  272.   return CMD_SUCCESS;
  273. }
  274. DEFUN (no_ripng_redistribute_bgp,
  275.        no_ripng_redistribute_bgp_cmd,
  276.        "no redistribute bgp",
  277.        NO_STR
  278.        "Redistribute information from another routing protocoln"
  279.        "Border Gateway Protocol (BGP)n")
  280. {
  281.   ripng_redistribute_metric_unset (ZEBRA_ROUTE_BGP);
  282.   ripng_redistribute_routemap_unset (ZEBRA_ROUTE_BGP);
  283.   return ripng_redistribute_unset (ZEBRA_ROUTE_BGP);
  284. }
  285. DEFUN (ripng_redistribute_ospf6,
  286.        ripng_redistribute_ospf6_cmd,
  287.        "redistribute ospf6",
  288.        "Redistribute information from another routing protocoln"
  289.        "IPv6 Open Shortest Path First (OSPFv3)n")
  290. {
  291.   zclient_redistribute_set (zclient, ZEBRA_ROUTE_OSPF6);
  292.   return CMD_SUCCESS;
  293. }
  294. DEFUN (no_ripng_redistribute_ospf6,
  295.        no_ripng_redistribute_ospf6_cmd,
  296.        "no redistribute ospf6",
  297.        NO_STR
  298.        "Redistribute information from another routing protocoln"
  299.        "IPv6 Open Shortest Path First (OSPFv3)n")
  300. {
  301.   ripng_redistribute_metric_unset (ZEBRA_ROUTE_OSPF6);
  302.   ripng_redistribute_routemap_unset (ZEBRA_ROUTE_OSPF6);
  303.   return ripng_redistribute_unset (ZEBRA_ROUTE_OSPF6);
  304. }
  305. DEFUN (ripng_redistribute_kernel_metric,
  306.        ripng_redistribute_kernel_metric_cmd,
  307.        "redistribute kernel metric <0-16>",
  308.        "Redistribute information from another routing protocoln"
  309.        "Kernel routesn"
  310.        "Metricn"
  311.        "Metric valuen")
  312. {
  313.   ripng_redistribute_metric_set (ZEBRA_ROUTE_KERNEL, atoi (argv[0]));
  314.   zclient_redistribute_set (zclient, ZEBRA_ROUTE_KERNEL);
  315.   return CMD_SUCCESS;
  316. }
  317. ALIAS (no_ripng_redistribute_kernel,
  318.        no_ripng_redistribute_kernel_metric_cmd,
  319.        "no redistribute kernel metric",
  320.        NO_STR
  321.        "Redistribute information from another routing protocoln"
  322.        "Kernel routesn"
  323.        "Metricn");
  324. ALIAS (no_ripng_redistribute_kernel,
  325.        no_ripng_redistribute_kernel_metric_val_cmd,
  326.        "no redistribute kernel metric <0-16>",
  327.        NO_STR
  328.        "Redistribute information from another routing protocoln"
  329.        "Kernel routesn"
  330.        "Metricn"
  331.        "Metric valuen");
  332. DEFUN (ripng_redistribute_connected_metric,
  333.        ripng_redistribute_connected_metric_cmd,
  334.        "redistribute connected metric <0-16>",
  335.        "Redistribute information from another routing protocoln"
  336.        "Connectedn"
  337.        "Metricn"
  338.        "Metric valuen")
  339. {
  340.   ripng_redistribute_metric_set (ZEBRA_ROUTE_CONNECT, atoi (argv[0]));
  341.   zclient_redistribute_set (zclient, ZEBRA_ROUTE_CONNECT);
  342.   return CMD_SUCCESS;
  343. }
  344. ALIAS (no_ripng_redistribute_connected,
  345.        no_ripng_redistribute_connected_metric_cmd,
  346.        "no redistribute connected metric",
  347.        NO_STR
  348.        "Redistribute information from another routing protocoln"
  349.        "Connectedn"
  350.        "Metricn");
  351. ALIAS (no_ripng_redistribute_connected,
  352.        no_ripng_redistribute_connected_metric_val_cmd,
  353.        "no redistribute connected metric <0-16>",
  354.        NO_STR
  355.        "Redistribute information from another routing protocoln"
  356.        "Connectedn"
  357.        "Metricn"
  358.        "Metric valuen");
  359. DEFUN (ripng_redistribute_static_metric,
  360.        ripng_redistribute_static_metric_cmd,
  361.        "redistribute static metric <0-16>",
  362.        "Redistribute information from another routing protocoln"
  363.        "Static routesn"
  364.        "Metricn"
  365.        "Metric valuen")
  366. {
  367.   ripng_redistribute_metric_set (ZEBRA_ROUTE_STATIC, atoi (argv[0]));
  368.   zclient_redistribute_set (zclient, ZEBRA_ROUTE_STATIC);
  369.   return CMD_SUCCESS;
  370. }
  371. ALIAS (no_ripng_redistribute_static,
  372.        no_ripng_redistribute_static_metric_cmd,
  373.        "no redistribute static metric",
  374.        NO_STR
  375.        "Redistribute information from another routing protocoln"
  376.        "Static routesn"
  377.        "Metricn");
  378. ALIAS (no_ripng_redistribute_static,
  379.        no_ripng_redistribute_static_metric_val_cmd,
  380.        "no redistribute static metric <0-16>",
  381.        NO_STR
  382.        "Redistribute information from another routing protocoln"
  383.        "Static routesn"
  384.        "Metricn"
  385.        "Metric valuen");
  386. DEFUN (ripng_redistribute_ospf6_metric,
  387.        ripng_redistribute_ospf6_metric_cmd,
  388.        "redistribute ospf6 metric <0-16>",
  389.        "Redistribute information from another routing protocoln"
  390.        "IPv6 Open Shortest Path First (OSPFv3)n"
  391.        "Metricn"
  392.        "Metric valuen")
  393. {
  394.   ripng_redistribute_metric_set (ZEBRA_ROUTE_OSPF6, atoi (argv[0]));
  395.   zclient_redistribute_set (zclient, ZEBRA_ROUTE_OSPF6);
  396.   return CMD_SUCCESS;
  397. }
  398. ALIAS (no_ripng_redistribute_ospf6,
  399.        no_ripng_redistribute_ospf6_metric_cmd,
  400.        "no redistribute ospf6 metric",
  401.        NO_STR
  402.        "Redistribute information from another routing protocoln"
  403.        "IPv6 Open Shortest Path First (OSPFv3)n"
  404.        "Metricn");
  405. ALIAS (no_ripng_redistribute_ospf6,
  406.        no_ripng_redistribute_ospf6_metric_val_cmd,
  407.        "no redistribute ospf6 metric <0-16>",
  408.        NO_STR
  409.        "Redistribute information from another routing protocoln"
  410.        "IPv6 Open Shortest Path First (OSPFv3)n"
  411.        "Metricn"
  412.        "Metric valuen");
  413. DEFUN (ripng_redistribute_bgp_metric,
  414.        ripng_redistribute_bgp_metric_cmd,
  415.        "redistribute bgp metric <0-16>",
  416.        "Redistribute information from another routing protocoln"
  417.        "Border Gateway Protocol (BGP)n"
  418.        "Metricn"
  419.        "Metric valuen")
  420. {
  421.   ripng_redistribute_metric_set (ZEBRA_ROUTE_BGP, atoi (argv[0]));
  422.   zclient_redistribute_set (zclient, ZEBRA_ROUTE_BGP);
  423.   return CMD_SUCCESS;
  424. }
  425. ALIAS (no_ripng_redistribute_bgp,
  426.        no_ripng_redistribute_bgp_metric_cmd,
  427.        "no redistribute bgp metric",
  428.        NO_STR
  429.        "Redistribute information from another routing protocoln"
  430.        "Border Gateway Protocol (BGP)n"
  431.        "Metricn");
  432. ALIAS (no_ripng_redistribute_bgp,
  433.        no_ripng_redistribute_bgp_metric_val_cmd,
  434.        "no redistribute bgp metric <0-16>",
  435.        NO_STR
  436.        "Redistribute information from another routing protocoln"
  437.        "Border Gateway Protocol (BGP)n"
  438.        "Metricn"
  439.        "Metric valuen");
  440. DEFUN (ripng_redistribute_kernel_routemap,
  441.        ripng_redistribute_kernel_routemap_cmd,
  442.        "redistribute kernel route-map WORD",
  443.        "Redistribute information from another routing protocoln"
  444.        "Kernel routesn"
  445.        "Route map referencen"
  446.        "Pointer to route-map entriesn")
  447. {
  448.   ripng_redistribute_routemap_set (ZEBRA_ROUTE_KERNEL, argv[0]);
  449.   zclient_redistribute_set (zclient, ZEBRA_ROUTE_KERNEL);
  450.   return CMD_SUCCESS;
  451. }
  452. ALIAS (no_ripng_redistribute_kernel,
  453.        no_ripng_redistribute_kernel_routemap_cmd,
  454.        "no redistribute kernel route-map WORD",
  455.        NO_STR
  456.        "Redistribute information from another routing protocoln"
  457.        "Kernel routesn"
  458.        "Route map referencen"
  459.        "Pointer to route-map entriesn");
  460. DEFUN (ripng_redistribute_connected_routemap,
  461.        ripng_redistribute_connected_routemap_cmd,
  462.        "redistribute connected route-map WORD",
  463.        "Redistribute information from another routing protocoln"
  464.        "Connectedn"
  465.        "Route map referencen"
  466.        "Pointer to route-map entriesn")
  467. {
  468.   ripng_redistribute_routemap_set (ZEBRA_ROUTE_CONNECT, argv[0]);
  469.   zclient_redistribute_set (zclient, ZEBRA_ROUTE_CONNECT);
  470.   return CMD_SUCCESS;
  471. }
  472. ALIAS (no_ripng_redistribute_connected,
  473.        no_ripng_redistribute_connected_routemap_cmd,
  474.        "no redistribute connected route-map WORD",
  475.        NO_STR
  476.        "Redistribute information from another routing protocoln"
  477.        "Connectedn"
  478.        "Route map referencen"
  479.        "Pointer to route-map entriesn");
  480. DEFUN (ripng_redistribute_static_routemap,
  481.        ripng_redistribute_static_routemap_cmd,
  482.        "redistribute static route-map WORD",
  483.        "Redistribute information from another routing protocoln"
  484.        "Static routesn"
  485.        "Route map referencen"
  486.        "Pointer to route-map entriesn")
  487. {
  488.   ripng_redistribute_routemap_set (ZEBRA_ROUTE_STATIC, argv[0]);
  489.   zclient_redistribute_set (zclient, ZEBRA_ROUTE_STATIC);
  490.   return CMD_SUCCESS;
  491. }
  492. ALIAS (no_ripng_redistribute_static,
  493.        no_ripng_redistribute_static_routemap_cmd,
  494.        "no redistribute static route-map WORD",
  495.        NO_STR
  496.        "Redistribute information from another routing protocoln"
  497.        "Static routesn"
  498.        "Route map referencen"
  499.        "Pointer to route-map entriesn");
  500. DEFUN (ripng_redistribute_ospf6_routemap,
  501.        ripng_redistribute_ospf6_routemap_cmd,
  502.        "redistribute ospf6 route-map WORD",
  503.        "Redistribute information from another routing protocoln"
  504.        "IPv6 Open Shortest Path First (OSPFv3)n"
  505.        "Route map referencen"
  506.        "Pointer to route-map entriesn")
  507. {
  508.   ripng_redistribute_routemap_set (ZEBRA_ROUTE_OSPF6, argv[0]);
  509.   zclient_redistribute_set (zclient, ZEBRA_ROUTE_OSPF6);
  510.   return CMD_SUCCESS;
  511. }
  512. ALIAS (no_ripng_redistribute_ospf6,
  513.        no_ripng_redistribute_ospf6_routemap_cmd,
  514.        "no redistribute ospf6 route-map WORD",
  515.        NO_STR
  516.        "Redistribute information from another routing protocoln"
  517.        "IPv6 Open Shortest Path First (OSPFv3)n"
  518.        "Route map referencen"
  519.        "Pointer to route-map entriesn");
  520. DEFUN (ripng_redistribute_bgp_routemap,
  521.        ripng_redistribute_bgp_routemap_cmd,
  522.        "redistribute bgp route-map WORD",
  523.        "Redistribute information from another routing protocoln"
  524.        "Border Gateway Protocol (BGP)n"
  525.        "Route map referencen"
  526.        "Pointer to route-map entriesn")
  527. {
  528.   ripng_redistribute_routemap_set (ZEBRA_ROUTE_BGP, argv[0]);
  529.   zclient_redistribute_set (zclient, ZEBRA_ROUTE_BGP);
  530.   return CMD_SUCCESS;
  531. }
  532. ALIAS (no_ripng_redistribute_bgp,
  533.        no_ripng_redistribute_bgp_routemap_cmd,
  534.        "no redistribute bgp route-map WORD",
  535.        NO_STR
  536.        "Redistribute information from another routing protocoln"
  537.        "Border Gateway Protocol (BGP)n"
  538.        "Route map referencen"
  539.        "Pointer to route-map entriesn");
  540. DEFUN (ripng_redistribute_kernel_metric_routemap,
  541.        ripng_redistribute_kernel_metric_routemap_cmd,
  542.        "redistribute kernel metric <0-16> route-map WORD",
  543.        "Redistribute information from another routing protocoln"
  544.        "Kernel routesn"
  545.        "Metricn"
  546.        "Metric valuen"
  547.        "Route map referencen"
  548.        "Pointer to route-map entriesn")
  549. {
  550.   ripng_redistribute_metric_set (ZEBRA_ROUTE_KERNEL, atoi (argv[0]));
  551.   ripng_redistribute_routemap_set (ZEBRA_ROUTE_KERNEL, argv[1]);
  552.   zclient_redistribute_set (zclient, ZEBRA_ROUTE_KERNEL);
  553.   return CMD_SUCCESS;
  554. }
  555. ALIAS (no_ripng_redistribute_kernel,
  556.        no_ripng_redistribute_kernel_metric_routemap_cmd,
  557.        "no redistribute kernel metric <0-16> route-map WORD",
  558.        NO_STR
  559.        "Redistribute information from another routing protocoln"
  560.        "Kernel routesn"
  561.        "Metricn"
  562.        "Metric valuen"
  563.        "Route map referencen"
  564.        "Pointer to route-map entriesn");
  565. DEFUN (ripng_redistribute_connected_metric_routemap,
  566.        ripng_redistribute_connected_metric_routemap_cmd,
  567.        "redistribute connected metric <0-16> route-map WORD",
  568.        "Redistribute information from another routing protocoln"
  569.        "Connectedn"
  570.        "Metricn"
  571.        "Metric valuen"
  572.        "Route map referencen"
  573.        "Pointer to route-map entriesn")
  574. {
  575.   ripng_redistribute_metric_set (ZEBRA_ROUTE_CONNECT, atoi (argv[0]));
  576.   ripng_redistribute_routemap_set (ZEBRA_ROUTE_CONNECT, argv[1]);
  577.   zclient_redistribute_set (zclient, ZEBRA_ROUTE_CONNECT);
  578.   return CMD_SUCCESS;
  579. }
  580. ALIAS (no_ripng_redistribute_connected,
  581.        no_ripng_redistribute_connected_metric_routemap_cmd,
  582.        "no redistribute connected metric <0-16> route-map WORD",
  583.        NO_STR
  584.        "Redistribute information from another routing protocoln"
  585.        "Connectedn"
  586.        "Metricn"
  587.        "Metric valuen"
  588.        "Route map referencen"
  589.        "Pointer to route-map entriesn");
  590. DEFUN (ripng_redistribute_static_metric_routemap,
  591.        ripng_redistribute_static_metric_routemap_cmd,
  592.        "redistribute static metric <0-16> route-map WORD",
  593.        "Redistribute information from another routing protocoln"
  594.        "Static routesn"
  595.        "Metricn"
  596.        "Metric valuen"
  597.        "Route map referencen"
  598.        "Pointer to route-map entriesn")
  599. {
  600.   ripng_redistribute_metric_set (ZEBRA_ROUTE_STATIC, atoi (argv[0]));
  601.   ripng_redistribute_routemap_set (ZEBRA_ROUTE_STATIC, argv[1]);
  602.   zclient_redistribute_set (zclient, ZEBRA_ROUTE_STATIC);
  603.   return CMD_SUCCESS;
  604. }
  605. ALIAS (no_ripng_redistribute_static,
  606.        no_ripng_redistribute_static_metric_routemap_cmd,
  607.        "no redistribute static metric <0-16> route-map WORD",
  608.        NO_STR
  609.        "Redistribute information from another routing protocoln"
  610.        "Static routesn"
  611.        "Metricn"
  612.        "Metric valuen"
  613.        "Route map referencen"
  614.        "Pointer to route-map entriesn");
  615. DEFUN (ripng_redistribute_ospf6_metric_routemap,
  616.        ripng_redistribute_ospf6_metric_routemap_cmd,
  617.        "redistribute ospf6 metric <0-16> route-map WORD",
  618.        "Redistribute information from another routing protocoln"
  619.        "IPv6 Open Shortest Path First (OSPFv3)n"
  620.        "Metricn"
  621.        "Metric valuen"
  622.        "Route map referencen"
  623.        "Pointer to route-map entriesn")
  624. {
  625.   ripng_redistribute_metric_set (ZEBRA_ROUTE_OSPF6, atoi (argv[0]));
  626.   ripng_redistribute_routemap_set (ZEBRA_ROUTE_OSPF6, argv[1]);
  627.   zclient_redistribute_set (zclient, ZEBRA_ROUTE_OSPF6);
  628.   return CMD_SUCCESS;
  629. }
  630. ALIAS (no_ripng_redistribute_ospf6,
  631.        no_ripng_redistribute_ospf6_metric_routemap_cmd,
  632.        "no redistribute ospf6 metric <0-16> route-map WORD",
  633.        NO_STR
  634.        "Redistribute information from another routing protocoln"
  635.        "IPv6 Open Shortest Path First (OSPFv3)n"
  636.        "Metricn"
  637.        "Metric valuen"
  638.        "Route map referencen"
  639.        "Pointer to route-map entriesn");
  640. DEFUN (ripng_redistribute_bgp_metric_routemap,
  641.        ripng_redistribute_bgp_metric_routemap_cmd,
  642.        "redistribute bgp metric <0-16> route-map WORD",
  643.        "Redistribute information from another routing protocoln"
  644.        "Border Gateway Protocol (BGP)n"
  645.        "Metricn"
  646.        "Metric valuen"
  647.        "Route map referencen"
  648.        "Pointer to route-map entriesn")
  649. {
  650.   ripng_redistribute_metric_set (ZEBRA_ROUTE_BGP, atoi (argv[0]));
  651.   ripng_redistribute_routemap_set (ZEBRA_ROUTE_BGP, argv[1]);
  652.   zclient_redistribute_set (zclient, ZEBRA_ROUTE_BGP);
  653.   return CMD_SUCCESS;
  654. }
  655. ALIAS (no_ripng_redistribute_bgp,
  656.        no_ripng_redistribute_bgp_metric_routemap_cmd,
  657.        "no redistribute bgp metric <0-16> route-map WORD",
  658.        NO_STR
  659.        "Redistribute information from another routing protocoln"
  660.        "Border Gateway Protocol (BGP)n"
  661.        "Metricn"
  662.        "Metric valuen"
  663.        "Route map referencen"
  664.        "Pointer to route-map entriesn");
  665. void
  666. ripng_redistribute_write (struct vty *vty)
  667. {
  668.   int i;
  669.   char *str[] = { "system", "kernel", "connected", "static", "rip",
  670.   "ripng", "ospf", "ospf6", "bgp"};
  671.   for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
  672.     if (i != zclient->redist_default && zclient->redist[i])
  673.       {
  674. if (ripng->route_map[i].metric_config)
  675.   {
  676.     if (ripng->route_map[i].name)
  677.       vty_out (vty, " redistribute %s metric %d route-map %s%s",
  678.        str[i], ripng->route_map[i].metric,
  679.        ripng->route_map[i].name, VTY_NEWLINE);
  680.     else
  681.       vty_out (vty, " redistribute %s metric %d%s",
  682.        str[i], ripng->route_map[i].metric, VTY_NEWLINE);
  683.   }
  684. else
  685.   {
  686.     if (ripng->route_map[i].name)
  687.       vty_out (vty, " redistribute %s route-map %s%s",
  688.        str[i], ripng->route_map[i].name, VTY_NEWLINE);
  689.     else
  690.       vty_out (vty, " redistribute %s%s", str[i], VTY_NEWLINE);
  691.   }
  692.       }
  693. }
  694. /* RIPng configuration write function. */
  695. int
  696. zebra_config_write (struct vty *vty)
  697. {
  698.   if (! zclient->enable)
  699.     {
  700.       vty_out (vty, "no router zebra%s", VTY_NEWLINE);
  701.       return 1;
  702.     }
  703.   else if (! zclient->redist[ZEBRA_ROUTE_RIPNG])
  704.     {
  705.       vty_out (vty, "router zebra%s", VTY_NEWLINE);
  706.       vty_out (vty, " no redistribute ripng%s", VTY_NEWLINE);
  707.       return 1;
  708.     }
  709.   return 0;
  710. }
  711. /* Zebra node structure. */
  712. struct cmd_node zebra_node =
  713. {
  714.   ZEBRA_NODE,
  715.   "%s(config-router)# ",
  716. };
  717. /* Initialize zebra structure and it's commands. */
  718. void
  719. zebra_init ()
  720. {
  721.   /* Allocate zebra structure. */
  722.   zclient = zclient_new ();
  723.   zclient_init (zclient, ZEBRA_ROUTE_RIPNG);
  724.   zclient->interface_up = ripng_interface_up;
  725.   zclient->interface_down = ripng_interface_down;
  726.   zclient->interface_add = ripng_interface_add;
  727.   zclient->interface_delete = ripng_interface_delete;
  728.   zclient->interface_address_add = ripng_interface_address_add;
  729.   zclient->interface_address_delete = ripng_interface_address_delete;
  730.   zclient->ipv6_route_add = ripng_zebra_read_ipv6;
  731.   zclient->ipv6_route_delete = ripng_zebra_read_ipv6;
  732.   
  733.   /* Install zebra node. */
  734.   install_node (&zebra_node, zebra_config_write);
  735.   /* Install command element for zebra node. */ 
  736.   install_element (CONFIG_NODE, &router_zebra_cmd);
  737.   install_element (CONFIG_NODE, &no_router_zebra_cmd);
  738.   install_default (ZEBRA_NODE);
  739.   install_element (ZEBRA_NODE, &ripng_redistribute_ripng_cmd);
  740.   install_element (ZEBRA_NODE, &no_ripng_redistribute_ripng_cmd);
  741.   install_element (RIPNG_NODE, &ripng_redistribute_static_cmd);
  742.   install_element (RIPNG_NODE, &no_ripng_redistribute_static_cmd);
  743.   install_element (RIPNG_NODE, &ripng_redistribute_kernel_cmd);
  744.   install_element (RIPNG_NODE, &no_ripng_redistribute_kernel_cmd);
  745.   install_element (RIPNG_NODE, &ripng_redistribute_connected_cmd);
  746.   install_element (RIPNG_NODE, &no_ripng_redistribute_connected_cmd);
  747.   install_element (RIPNG_NODE, &ripng_redistribute_bgp_cmd);
  748.   install_element (RIPNG_NODE, &no_ripng_redistribute_bgp_cmd);
  749.   install_element (RIPNG_NODE, &ripng_redistribute_ospf6_cmd);
  750.   install_element (RIPNG_NODE, &no_ripng_redistribute_ospf6_cmd);
  751.   install_element (RIPNG_NODE, &ripng_redistribute_kernel_metric_cmd);
  752.   install_element (RIPNG_NODE, &no_ripng_redistribute_kernel_metric_cmd);
  753.   install_element (RIPNG_NODE, &no_ripng_redistribute_kernel_metric_val_cmd);
  754.   install_element (RIPNG_NODE, &ripng_redistribute_connected_metric_cmd);
  755.   install_element (RIPNG_NODE, &no_ripng_redistribute_connected_metric_cmd);
  756.   install_element (RIPNG_NODE,
  757.    &no_ripng_redistribute_connected_metric_val_cmd);
  758.   install_element (RIPNG_NODE, &ripng_redistribute_static_metric_cmd);
  759.   install_element (RIPNG_NODE, &no_ripng_redistribute_static_metric_cmd);
  760.   install_element (RIPNG_NODE, &no_ripng_redistribute_static_metric_val_cmd);
  761.   install_element (RIPNG_NODE, &ripng_redistribute_ospf6_metric_cmd);
  762.   install_element (RIPNG_NODE, &no_ripng_redistribute_ospf6_metric_cmd);
  763.   install_element (RIPNG_NODE, &no_ripng_redistribute_ospf6_metric_val_cmd);
  764.   install_element (RIPNG_NODE, &ripng_redistribute_bgp_metric_cmd);
  765.   install_element (RIPNG_NODE, &no_ripng_redistribute_bgp_metric_cmd);
  766.   install_element (RIPNG_NODE, &no_ripng_redistribute_bgp_metric_val_cmd);
  767.   install_element (RIPNG_NODE, &ripng_redistribute_kernel_routemap_cmd);
  768.   install_element (RIPNG_NODE, &no_ripng_redistribute_kernel_routemap_cmd);
  769.   install_element (RIPNG_NODE, &ripng_redistribute_connected_routemap_cmd);
  770.   install_element (RIPNG_NODE, &no_ripng_redistribute_connected_routemap_cmd);
  771.   install_element (RIPNG_NODE, &ripng_redistribute_static_routemap_cmd);
  772.   install_element (RIPNG_NODE, &no_ripng_redistribute_static_routemap_cmd);
  773.   install_element (RIPNG_NODE, &ripng_redistribute_ospf6_routemap_cmd);
  774.   install_element (RIPNG_NODE, &no_ripng_redistribute_ospf6_routemap_cmd);
  775.   install_element (RIPNG_NODE, &ripng_redistribute_bgp_routemap_cmd);
  776.   install_element (RIPNG_NODE, &no_ripng_redistribute_bgp_routemap_cmd);
  777.   install_element (RIPNG_NODE, &ripng_redistribute_kernel_metric_routemap_cmd);
  778.   install_element (RIPNG_NODE,
  779.    &no_ripng_redistribute_kernel_metric_routemap_cmd);
  780.   install_element (RIPNG_NODE,
  781.    &ripng_redistribute_connected_metric_routemap_cmd);
  782.   install_element (RIPNG_NODE,
  783.    &no_ripng_redistribute_connected_metric_routemap_cmd);
  784.   install_element (RIPNG_NODE, &ripng_redistribute_static_metric_routemap_cmd);
  785.   install_element (RIPNG_NODE,
  786.    &no_ripng_redistribute_static_metric_routemap_cmd);
  787.   install_element (RIPNG_NODE, &ripng_redistribute_ospf6_metric_routemap_cmd);
  788.   install_element (RIPNG_NODE,
  789.    &no_ripng_redistribute_ospf6_metric_routemap_cmd);
  790.   install_element (RIPNG_NODE, &ripng_redistribute_bgp_metric_routemap_cmd);
  791.   install_element (RIPNG_NODE, &no_ripng_redistribute_bgp_metric_routemap_cmd);
  792. }