From 718e3744195351130f4ce7dbe0613f4b3e23df93 Mon Sep 17 00:00:00 2001 From: paul Date: Fri, 13 Dec 2002 20:15:29 +0000 Subject: Initial revision --- ripngd/ripng_zebra.c | 877 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 877 insertions(+) create mode 100644 ripngd/ripng_zebra.c (limited to 'ripngd/ripng_zebra.c') diff --git a/ripngd/ripng_zebra.c b/ripngd/ripng_zebra.c new file mode 100644 index 00000000..4d8a48d3 --- /dev/null +++ b/ripngd/ripng_zebra.c @@ -0,0 +1,877 @@ +/* + * RIPngd and zebra interface. + * Copyright (C) 1998, 1999 Kunihiro Ishiguro + * + * This file is part of GNU Zebra. + * + * GNU Zebra is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * GNU Zebra is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Zebra; see the file COPYING. If not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +#include + +#include "command.h" +#include "prefix.h" +#include "stream.h" +#include "routemap.h" +#include "zclient.h" +#include "log.h" + +#include "ripngd/ripngd.h" + +/* All information about zebra. */ +struct zclient *zclient = NULL; + +/* Callback prototypes for zebra client service. */ +int ripng_interface_up (int, struct zclient *, zebra_size_t); +int ripng_interface_down (int, struct zclient *, zebra_size_t); +int ripng_interface_add (int, struct zclient *, zebra_size_t); +int ripng_interface_delete (int, struct zclient *, zebra_size_t); +int ripng_interface_address_add (int, struct zclient *, zebra_size_t); +int ripng_interface_address_delete (int, struct zclient *, zebra_size_t); + +void +ripng_zebra_ipv6_add (struct prefix_ipv6 *p, struct in6_addr *nexthop, + unsigned int ifindex) +{ + struct zapi_ipv6 api; + + if (zclient->redist[ZEBRA_ROUTE_RIPNG]) + { + api.type = ZEBRA_ROUTE_RIPNG; + api.flags = 0; + api.message = 0; + SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP); + api.nexthop_num = 1; + api.nexthop = &nexthop; + SET_FLAG (api.message, ZAPI_MESSAGE_IFINDEX); + api.ifindex_num = 1; + api.ifindex = &ifindex; + + zapi_ipv6_add (zclient, p, &api); + } +} + +void +ripng_zebra_ipv6_delete (struct prefix_ipv6 *p, struct in6_addr *nexthop, + unsigned int ifindex) +{ + struct zapi_ipv6 api; + + if (zclient->redist[ZEBRA_ROUTE_RIPNG]) + { + api.type = ZEBRA_ROUTE_RIPNG; + api.flags = 0; + api.message = 0; + SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP); + api.nexthop_num = 1; + api.nexthop = &nexthop; + SET_FLAG (api.message, ZAPI_MESSAGE_IFINDEX); + api.ifindex_num = 1; + api.ifindex = &ifindex; + + zapi_ipv6_delete (zclient, p, &api); + } +} + +/* Zebra route add and delete treatment. */ +int +ripng_zebra_read_ipv6 (int command, struct zclient *zclient, + zebra_size_t length) +{ + struct stream *s; + struct zapi_ipv6 api; + unsigned long ifindex; + struct in6_addr nexthop; + struct prefix_ipv6 p; + + s = zclient->ibuf; + ifindex = 0; + memset (&nexthop, 0, sizeof (struct in6_addr)); + + /* Type, flags, message. */ + api.type = stream_getc (s); + api.flags = stream_getc (s); + api.message = stream_getc (s); + + /* IPv6 prefix. */ + memset (&p, 0, sizeof (struct prefix_ipv6)); + p.family = AF_INET6; + p.prefixlen = stream_getc (s); + stream_get (&p.prefix, s, PSIZE (p.prefixlen)); + + /* Nexthop, ifindex, distance, metric. */ + if (CHECK_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP)) + { + api.nexthop_num = stream_getc (s); + stream_get (&nexthop, s, 16); + } + if (CHECK_FLAG (api.message, ZAPI_MESSAGE_IFINDEX)) + { + api.ifindex_num = stream_getc (s); + ifindex = stream_getl (s); + } + if (CHECK_FLAG (api.message, ZAPI_MESSAGE_DISTANCE)) + api.distance = stream_getc (s); + else + api.distance = 0; + if (CHECK_FLAG (api.message, ZAPI_MESSAGE_METRIC)) + api.metric = stream_getl (s); + else + api.metric = 0; + + if (command == ZEBRA_IPV6_ROUTE_ADD) + ripng_redistribute_add (api.type, 0, &p, ifindex); + else + ripng_redistribute_delete (api.type, 0, &p, ifindex); + + return 0; +} + +int +ripng_redistribute_unset (int type) +{ + if (! zclient->redist[type]) + return CMD_SUCCESS; + + zclient->redist[type] = 0; + + if (zclient->sock > 0) + zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE, zclient->sock, type); + + ripng_redistribute_withdraw (type); + + return CMD_SUCCESS; +} + +void +ripng_redistribute_metric_set (int type, int metric) +{ + ripng->route_map[type].metric_config = 1; + ripng->route_map[type].metric = metric; +} + +void +ripng_redistribute_metric_unset (int type) +{ + ripng->route_map[type].metric_config = 0; + ripng->route_map[type].metric = 0; +} + +void +ripng_redistribute_routemap_set (int type, char *name) +{ + if (ripng->route_map[type].name) + free (ripng->route_map[type].name); + + ripng->route_map[type].name = strdup (name); + ripng->route_map[type].map = route_map_lookup_by_name (name); +} + +void +ripng_redistribute_routemap_unset (int type) +{ + if (ripng->route_map[type].name) + free (ripng->route_map[type].name); + + ripng->route_map[type].name = NULL; + ripng->route_map[type].map = NULL; +} + + +DEFUN (router_zebra, + router_zebra_cmd, + "router zebra", + "Enable a routing process\n" + "Make connection to zebra daemon\n") +{ + vty->node = ZEBRA_NODE; + zclient->enable = 1; + zclient_start (zclient); + return CMD_SUCCESS; +} + +DEFUN (no_router_zebra, + no_router_zebra_cmd, + "no router zebra", + NO_STR + "Disable a routing process\n" + "Stop connection to zebra daemon\n") +{ + zclient->enable = 0; + zclient_stop (zclient); + return CMD_SUCCESS; +} + +DEFUN (ripng_redistribute_ripng, + ripng_redistribute_ripng_cmd, + "redistribute ripng", + "Redistribute information from another routing protocol\n" + "RIPng route\n") +{ + zclient->redist[ZEBRA_ROUTE_RIPNG] = 1; + return CMD_SUCCESS; +} + +DEFUN (no_ripng_redistribute_ripng, + no_ripng_redistribute_ripng_cmd, + "no redistribute ripng", + NO_STR + "Redistribute information from another routing protocol\n" + "RIPng route\n") +{ + zclient->redist[ZEBRA_ROUTE_RIPNG] = 0; + return CMD_SUCCESS; +} + +DEFUN (ripng_redistribute_static, + ripng_redistribute_static_cmd, + "redistribute static", + "Redistribute information from another routing protocol\n" + "Static routes\n") +{ + zclient_redistribute_set (zclient, ZEBRA_ROUTE_STATIC); + return CMD_SUCCESS; +} + +DEFUN (no_ripng_redistribute_static, + no_ripng_redistribute_static_cmd, + "no redistribute static", + NO_STR + "Redistribute information from another routing protocol\n" + "Static routes\n") +{ + ripng_redistribute_metric_unset (ZEBRA_ROUTE_STATIC); + ripng_redistribute_routemap_unset (ZEBRA_ROUTE_STATIC); + return ripng_redistribute_unset (ZEBRA_ROUTE_STATIC); +} + +DEFUN (ripng_redistribute_kernel, + ripng_redistribute_kernel_cmd, + "redistribute kernel", + "Redistribute information from another routing protocol\n" + "Kernel routes\n") +{ + zclient_redistribute_set (zclient, ZEBRA_ROUTE_KERNEL); + return CMD_SUCCESS; +} + +DEFUN (no_ripng_redistribute_kernel, + no_ripng_redistribute_kernel_cmd, + "no redistribute kernel", + NO_STR + "Redistribute information from another routing protocol\n" + "Kernel routes\n") +{ + ripng_redistribute_metric_unset (ZEBRA_ROUTE_KERNEL); + ripng_redistribute_routemap_unset (ZEBRA_ROUTE_KERNEL); + return ripng_redistribute_unset (ZEBRA_ROUTE_KERNEL); +} + +DEFUN (ripng_redistribute_connected, + ripng_redistribute_connected_cmd, + "redistribute connected", + "Redistribute information from another routing protocol\n" + "Connected\n") +{ + zclient_redistribute_set (zclient, ZEBRA_ROUTE_CONNECT); + return CMD_SUCCESS; +} + +DEFUN (no_ripng_redistribute_connected, + no_ripng_redistribute_connected_cmd, + "no redistribute connected", + NO_STR + "Redistribute information from another routing protocol\n" + "Connected\n") +{ + ripng_redistribute_metric_unset (ZEBRA_ROUTE_CONNECT); + ripng_redistribute_routemap_unset (ZEBRA_ROUTE_CONNECT); + return ripng_redistribute_unset (ZEBRA_ROUTE_CONNECT); +} + +DEFUN (ripng_redistribute_bgp, + ripng_redistribute_bgp_cmd, + "redistribute bgp", + "Redistribute information from another routing protocol\n" + "Border Gateway Protocol (BGP)\n") +{ + zclient_redistribute_set (zclient, ZEBRA_ROUTE_BGP); + return CMD_SUCCESS; +} + +DEFUN (no_ripng_redistribute_bgp, + no_ripng_redistribute_bgp_cmd, + "no redistribute bgp", + NO_STR + "Redistribute information from another routing protocol\n" + "Border Gateway Protocol (BGP)\n") +{ + ripng_redistribute_metric_unset (ZEBRA_ROUTE_BGP); + ripng_redistribute_routemap_unset (ZEBRA_ROUTE_BGP); + return ripng_redistribute_unset (ZEBRA_ROUTE_BGP); +} + +DEFUN (ripng_redistribute_ospf6, + ripng_redistribute_ospf6_cmd, + "redistribute ospf6", + "Redistribute information from another routing protocol\n" + "IPv6 Open Shortest Path First (OSPFv3)\n") +{ + zclient_redistribute_set (zclient, ZEBRA_ROUTE_OSPF6); + return CMD_SUCCESS; +} + +DEFUN (no_ripng_redistribute_ospf6, + no_ripng_redistribute_ospf6_cmd, + "no redistribute ospf6", + NO_STR + "Redistribute information from another routing protocol\n" + "IPv6 Open Shortest Path First (OSPFv3)\n") +{ + ripng_redistribute_metric_unset (ZEBRA_ROUTE_OSPF6); + ripng_redistribute_routemap_unset (ZEBRA_ROUTE_OSPF6); + return ripng_redistribute_unset (ZEBRA_ROUTE_OSPF6); +} + +DEFUN (ripng_redistribute_kernel_metric, + ripng_redistribute_kernel_metric_cmd, + "redistribute kernel metric <0-16>", + "Redistribute information from another routing protocol\n" + "Kernel routes\n" + "Metric\n" + "Metric value\n") +{ + ripng_redistribute_metric_set (ZEBRA_ROUTE_KERNEL, atoi (argv[0])); + zclient_redistribute_set (zclient, ZEBRA_ROUTE_KERNEL); + return CMD_SUCCESS; +} + +ALIAS (no_ripng_redistribute_kernel, + no_ripng_redistribute_kernel_metric_cmd, + "no redistribute kernel metric", + NO_STR + "Redistribute information from another routing protocol\n" + "Kernel routes\n" + "Metric\n") + +ALIAS (no_ripng_redistribute_kernel, + no_ripng_redistribute_kernel_metric_val_cmd, + "no redistribute kernel metric <0-16>", + NO_STR + "Redistribute information from another routing protocol\n" + "Kernel routes\n" + "Metric\n" + "Metric value\n") + +DEFUN (ripng_redistribute_connected_metric, + ripng_redistribute_connected_metric_cmd, + "redistribute connected metric <0-16>", + "Redistribute information from another routing protocol\n" + "Connected\n" + "Metric\n" + "Metric value\n") +{ + ripng_redistribute_metric_set (ZEBRA_ROUTE_CONNECT, atoi (argv[0])); + zclient_redistribute_set (zclient, ZEBRA_ROUTE_CONNECT); + return CMD_SUCCESS; +} + +ALIAS (no_ripng_redistribute_connected, + no_ripng_redistribute_connected_metric_cmd, + "no redistribute connected metric", + NO_STR + "Redistribute information from another routing protocol\n" + "Connected\n" + "Metric\n") + +ALIAS (no_ripng_redistribute_connected, + no_ripng_redistribute_connected_metric_val_cmd, + "no redistribute connected metric <0-16>", + NO_STR + "Redistribute information from another routing protocol\n" + "Connected\n" + "Metric\n" + "Metric value\n") + +DEFUN (ripng_redistribute_static_metric, + ripng_redistribute_static_metric_cmd, + "redistribute static metric <0-16>", + "Redistribute information from another routing protocol\n" + "Static routes\n" + "Metric\n" + "Metric value\n") +{ + ripng_redistribute_metric_set (ZEBRA_ROUTE_STATIC, atoi (argv[0])); + zclient_redistribute_set (zclient, ZEBRA_ROUTE_STATIC); + return CMD_SUCCESS; +} + +ALIAS (no_ripng_redistribute_static, + no_ripng_redistribute_static_metric_cmd, + "no redistribute static metric", + NO_STR + "Redistribute information from another routing protocol\n" + "Static routes\n" + "Metric\n") + +ALIAS (no_ripng_redistribute_static, + no_ripng_redistribute_static_metric_val_cmd, + "no redistribute static metric <0-16>", + NO_STR + "Redistribute information from another routing protocol\n" + "Static routes\n" + "Metric\n" + "Metric value\n") + +DEFUN (ripng_redistribute_ospf6_metric, + ripng_redistribute_ospf6_metric_cmd, + "redistribute ospf6 metric <0-16>", + "Redistribute information from another routing protocol\n" + "IPv6 Open Shortest Path First (OSPFv3)\n" + "Metric\n" + "Metric value\n") +{ + ripng_redistribute_metric_set (ZEBRA_ROUTE_OSPF6, atoi (argv[0])); + zclient_redistribute_set (zclient, ZEBRA_ROUTE_OSPF6); + return CMD_SUCCESS; +} + +ALIAS (no_ripng_redistribute_ospf6, + no_ripng_redistribute_ospf6_metric_cmd, + "no redistribute ospf6 metric", + NO_STR + "Redistribute information from another routing protocol\n" + "IPv6 Open Shortest Path First (OSPFv3)\n" + "Metric\n") + +ALIAS (no_ripng_redistribute_ospf6, + no_ripng_redistribute_ospf6_metric_val_cmd, + "no redistribute ospf6 metric <0-16>", + NO_STR + "Redistribute information from another routing protocol\n" + "IPv6 Open Shortest Path First (OSPFv3)\n" + "Metric\n" + "Metric value\n") + +DEFUN (ripng_redistribute_bgp_metric, + ripng_redistribute_bgp_metric_cmd, + "redistribute bgp metric <0-16>", + "Redistribute information from another routing protocol\n" + "Border Gateway Protocol (BGP)\n" + "Metric\n" + "Metric value\n") +{ + ripng_redistribute_metric_set (ZEBRA_ROUTE_BGP, atoi (argv[0])); + zclient_redistribute_set (zclient, ZEBRA_ROUTE_BGP); + return CMD_SUCCESS; +} + +ALIAS (no_ripng_redistribute_bgp, + no_ripng_redistribute_bgp_metric_cmd, + "no redistribute bgp metric", + NO_STR + "Redistribute information from another routing protocol\n" + "Border Gateway Protocol (BGP)\n" + "Metric\n") + +ALIAS (no_ripng_redistribute_bgp, + no_ripng_redistribute_bgp_metric_val_cmd, + "no redistribute bgp metric <0-16>", + NO_STR + "Redistribute information from another routing protocol\n" + "Border Gateway Protocol (BGP)\n" + "Metric\n" + "Metric value\n") + +DEFUN (ripng_redistribute_kernel_routemap, + ripng_redistribute_kernel_routemap_cmd, + "redistribute kernel route-map WORD", + "Redistribute information from another routing protocol\n" + "Kernel routes\n" + "Route map reference\n" + "Pointer to route-map entries\n") +{ + ripng_redistribute_routemap_set (ZEBRA_ROUTE_KERNEL, argv[0]); + zclient_redistribute_set (zclient, ZEBRA_ROUTE_KERNEL); + return CMD_SUCCESS; +} + +ALIAS (no_ripng_redistribute_kernel, + no_ripng_redistribute_kernel_routemap_cmd, + "no redistribute kernel route-map WORD", + NO_STR + "Redistribute information from another routing protocol\n" + "Kernel routes\n" + "Route map reference\n" + "Pointer to route-map entries\n") + +DEFUN (ripng_redistribute_connected_routemap, + ripng_redistribute_connected_routemap_cmd, + "redistribute connected route-map WORD", + "Redistribute information from another routing protocol\n" + "Connected\n" + "Route map reference\n" + "Pointer to route-map entries\n") +{ + ripng_redistribute_routemap_set (ZEBRA_ROUTE_CONNECT, argv[0]); + zclient_redistribute_set (zclient, ZEBRA_ROUTE_CONNECT); + return CMD_SUCCESS; +} + +ALIAS (no_ripng_redistribute_connected, + no_ripng_redistribute_connected_routemap_cmd, + "no redistribute connected route-map WORD", + NO_STR + "Redistribute information from another routing protocol\n" + "Connected\n" + "Route map reference\n" + "Pointer to route-map entries\n") + +DEFUN (ripng_redistribute_static_routemap, + ripng_redistribute_static_routemap_cmd, + "redistribute static route-map WORD", + "Redistribute information from another routing protocol\n" + "Static routes\n" + "Route map reference\n" + "Pointer to route-map entries\n") +{ + ripng_redistribute_routemap_set (ZEBRA_ROUTE_STATIC, argv[0]); + zclient_redistribute_set (zclient, ZEBRA_ROUTE_STATIC); + return CMD_SUCCESS; +} + +ALIAS (no_ripng_redistribute_static, + no_ripng_redistribute_static_routemap_cmd, + "no redistribute static route-map WORD", + NO_STR + "Redistribute information from another routing protocol\n" + "Static routes\n" + "Route map reference\n" + "Pointer to route-map entries\n") + +DEFUN (ripng_redistribute_ospf6_routemap, + ripng_redistribute_ospf6_routemap_cmd, + "redistribute ospf6 route-map WORD", + "Redistribute information from another routing protocol\n" + "IPv6 Open Shortest Path First (OSPFv3)\n" + "Route map reference\n" + "Pointer to route-map entries\n") +{ + ripng_redistribute_routemap_set (ZEBRA_ROUTE_OSPF6, argv[0]); + zclient_redistribute_set (zclient, ZEBRA_ROUTE_OSPF6); + return CMD_SUCCESS; +} + +ALIAS (no_ripng_redistribute_ospf6, + no_ripng_redistribute_ospf6_routemap_cmd, + "no redistribute ospf6 route-map WORD", + NO_STR + "Redistribute information from another routing protocol\n" + "IPv6 Open Shortest Path First (OSPFv3)\n" + "Route map reference\n" + "Pointer to route-map entries\n") + +DEFUN (ripng_redistribute_bgp_routemap, + ripng_redistribute_bgp_routemap_cmd, + "redistribute bgp route-map WORD", + "Redistribute information from another routing protocol\n" + "Border Gateway Protocol (BGP)\n" + "Route map reference\n" + "Pointer to route-map entries\n") +{ + ripng_redistribute_routemap_set (ZEBRA_ROUTE_BGP, argv[0]); + zclient_redistribute_set (zclient, ZEBRA_ROUTE_BGP); + return CMD_SUCCESS; +} + +ALIAS (no_ripng_redistribute_bgp, + no_ripng_redistribute_bgp_routemap_cmd, + "no redistribute bgp route-map WORD", + NO_STR + "Redistribute information from another routing protocol\n" + "Border Gateway Protocol (BGP)\n" + "Route map reference\n" + "Pointer to route-map entries\n") + +DEFUN (ripng_redistribute_kernel_metric_routemap, + ripng_redistribute_kernel_metric_routemap_cmd, + "redistribute kernel metric <0-16> route-map WORD", + "Redistribute information from another routing protocol\n" + "Kernel routes\n" + "Metric\n" + "Metric value\n" + "Route map reference\n" + "Pointer to route-map entries\n") +{ + ripng_redistribute_metric_set (ZEBRA_ROUTE_KERNEL, atoi (argv[0])); + ripng_redistribute_routemap_set (ZEBRA_ROUTE_KERNEL, argv[1]); + zclient_redistribute_set (zclient, ZEBRA_ROUTE_KERNEL); + return CMD_SUCCESS; +} + +ALIAS (no_ripng_redistribute_kernel, + no_ripng_redistribute_kernel_metric_routemap_cmd, + "no redistribute kernel metric <0-16> route-map WORD", + NO_STR + "Redistribute information from another routing protocol\n" + "Kernel routes\n" + "Metric\n" + "Metric value\n" + "Route map reference\n" + "Pointer to route-map entries\n") + +DEFUN (ripng_redistribute_connected_metric_routemap, + ripng_redistribute_connected_metric_routemap_cmd, + "redistribute connected metric <0-16> route-map WORD", + "Redistribute information from another routing protocol\n" + "Connected\n" + "Metric\n" + "Metric value\n" + "Route map reference\n" + "Pointer to route-map entries\n") +{ + ripng_redistribute_metric_set (ZEBRA_ROUTE_CONNECT, atoi (argv[0])); + ripng_redistribute_routemap_set (ZEBRA_ROUTE_CONNECT, argv[1]); + zclient_redistribute_set (zclient, ZEBRA_ROUTE_CONNECT); + return CMD_SUCCESS; +} + +ALIAS (no_ripng_redistribute_connected, + no_ripng_redistribute_connected_metric_routemap_cmd, + "no redistribute connected metric <0-16> route-map WORD", + NO_STR + "Redistribute information from another routing protocol\n" + "Connected\n" + "Metric\n" + "Metric value\n" + "Route map reference\n" + "Pointer to route-map entries\n") + +DEFUN (ripng_redistribute_static_metric_routemap, + ripng_redistribute_static_metric_routemap_cmd, + "redistribute static metric <0-16> route-map WORD", + "Redistribute information from another routing protocol\n" + "Static routes\n" + "Metric\n" + "Metric value\n" + "Route map reference\n" + "Pointer to route-map entries\n") +{ + ripng_redistribute_metric_set (ZEBRA_ROUTE_STATIC, atoi (argv[0])); + ripng_redistribute_routemap_set (ZEBRA_ROUTE_STATIC, argv[1]); + zclient_redistribute_set (zclient, ZEBRA_ROUTE_STATIC); + return CMD_SUCCESS; +} + +ALIAS (no_ripng_redistribute_static, + no_ripng_redistribute_static_metric_routemap_cmd, + "no redistribute static metric <0-16> route-map WORD", + NO_STR + "Redistribute information from another routing protocol\n" + "Static routes\n" + "Metric\n" + "Metric value\n" + "Route map reference\n" + "Pointer to route-map entries\n") + +DEFUN (ripng_redistribute_ospf6_metric_routemap, + ripng_redistribute_ospf6_metric_routemap_cmd, + "redistribute ospf6 metric <0-16> route-map WORD", + "Redistribute information from another routing protocol\n" + "IPv6 Open Shortest Path First (OSPFv3)\n" + "Metric\n" + "Metric value\n" + "Route map reference\n" + "Pointer to route-map entries\n") +{ + ripng_redistribute_metric_set (ZEBRA_ROUTE_OSPF6, atoi (argv[0])); + ripng_redistribute_routemap_set (ZEBRA_ROUTE_OSPF6, argv[1]); + zclient_redistribute_set (zclient, ZEBRA_ROUTE_OSPF6); + return CMD_SUCCESS; +} + +ALIAS (no_ripng_redistribute_ospf6, + no_ripng_redistribute_ospf6_metric_routemap_cmd, + "no redistribute ospf6 metric <0-16> route-map WORD", + NO_STR + "Redistribute information from another routing protocol\n" + "IPv6 Open Shortest Path First (OSPFv3)\n" + "Metric\n" + "Metric value\n" + "Route map reference\n" + "Pointer to route-map entries\n") + +DEFUN (ripng_redistribute_bgp_metric_routemap, + ripng_redistribute_bgp_metric_routemap_cmd, + "redistribute bgp metric <0-16> route-map WORD", + "Redistribute information from another routing protocol\n" + "Border Gateway Protocol (BGP)\n" + "Metric\n" + "Metric value\n" + "Route map reference\n" + "Pointer to route-map entries\n") +{ + ripng_redistribute_metric_set (ZEBRA_ROUTE_BGP, atoi (argv[0])); + ripng_redistribute_routemap_set (ZEBRA_ROUTE_BGP, argv[1]); + zclient_redistribute_set (zclient, ZEBRA_ROUTE_BGP); + return CMD_SUCCESS; +} + +ALIAS (no_ripng_redistribute_bgp, + no_ripng_redistribute_bgp_metric_routemap_cmd, + "no redistribute bgp metric <0-16> route-map WORD", + NO_STR + "Redistribute information from another routing protocol\n" + "Border Gateway Protocol (BGP)\n" + "Metric\n" + "Metric value\n" + "Route map reference\n" + "Pointer to route-map entries\n") + +void +ripng_redistribute_write (struct vty *vty) +{ + int i; + char *str[] = { "system", "kernel", "connected", "static", "rip", + "ripng", "ospf", "ospf6", "bgp"}; + + for (i = 0; i < ZEBRA_ROUTE_MAX; i++) + if (i != zclient->redist_default && zclient->redist[i]) + { + if (ripng->route_map[i].metric_config) + { + if (ripng->route_map[i].name) + vty_out (vty, " redistribute %s metric %d route-map %s%s", + str[i], ripng->route_map[i].metric, + ripng->route_map[i].name, VTY_NEWLINE); + else + vty_out (vty, " redistribute %s metric %d%s", + str[i], ripng->route_map[i].metric, VTY_NEWLINE); + } + else + { + if (ripng->route_map[i].name) + vty_out (vty, " redistribute %s route-map %s%s", + str[i], ripng->route_map[i].name, VTY_NEWLINE); + else + vty_out (vty, " redistribute %s%s", str[i], VTY_NEWLINE); + } + } +} + +/* RIPng configuration write function. */ +int +zebra_config_write (struct vty *vty) +{ + if (! zclient->enable) + { + vty_out (vty, "no router zebra%s", VTY_NEWLINE); + return 1; + } + else if (! zclient->redist[ZEBRA_ROUTE_RIPNG]) + { + vty_out (vty, "router zebra%s", VTY_NEWLINE); + vty_out (vty, " no redistribute ripng%s", VTY_NEWLINE); + return 1; + } + return 0; +} + +/* Zebra node structure. */ +struct cmd_node zebra_node = +{ + ZEBRA_NODE, + "%s(config-router)# ", +}; + +/* Initialize zebra structure and it's commands. */ +void +zebra_init () +{ + /* Allocate zebra structure. */ + zclient = zclient_new (); + zclient_init (zclient, ZEBRA_ROUTE_RIPNG); + + zclient->interface_up = ripng_interface_up; + zclient->interface_down = ripng_interface_down; + zclient->interface_add = ripng_interface_add; + zclient->interface_delete = ripng_interface_delete; + zclient->interface_address_add = ripng_interface_address_add; + zclient->interface_address_delete = ripng_interface_address_delete; + zclient->ipv6_route_add = ripng_zebra_read_ipv6; + zclient->ipv6_route_delete = ripng_zebra_read_ipv6; + + /* Install zebra node. */ + install_node (&zebra_node, zebra_config_write); + + /* Install command element for zebra node. */ + install_element (CONFIG_NODE, &router_zebra_cmd); + install_element (CONFIG_NODE, &no_router_zebra_cmd); + install_default (ZEBRA_NODE); + install_element (ZEBRA_NODE, &ripng_redistribute_ripng_cmd); + install_element (ZEBRA_NODE, &no_ripng_redistribute_ripng_cmd); + install_element (RIPNG_NODE, &ripng_redistribute_static_cmd); + install_element (RIPNG_NODE, &no_ripng_redistribute_static_cmd); + install_element (RIPNG_NODE, &ripng_redistribute_kernel_cmd); + install_element (RIPNG_NODE, &no_ripng_redistribute_kernel_cmd); + install_element (RIPNG_NODE, &ripng_redistribute_connected_cmd); + install_element (RIPNG_NODE, &no_ripng_redistribute_connected_cmd); + install_element (RIPNG_NODE, &ripng_redistribute_bgp_cmd); + install_element (RIPNG_NODE, &no_ripng_redistribute_bgp_cmd); + install_element (RIPNG_NODE, &ripng_redistribute_ospf6_cmd); + install_element (RIPNG_NODE, &no_ripng_redistribute_ospf6_cmd); + install_element (RIPNG_NODE, &ripng_redistribute_kernel_metric_cmd); + install_element (RIPNG_NODE, &no_ripng_redistribute_kernel_metric_cmd); + install_element (RIPNG_NODE, &no_ripng_redistribute_kernel_metric_val_cmd); + install_element (RIPNG_NODE, &ripng_redistribute_connected_metric_cmd); + install_element (RIPNG_NODE, &no_ripng_redistribute_connected_metric_cmd); + install_element (RIPNG_NODE, + &no_ripng_redistribute_connected_metric_val_cmd); + install_element (RIPNG_NODE, &ripng_redistribute_static_metric_cmd); + install_element (RIPNG_NODE, &no_ripng_redistribute_static_metric_cmd); + install_element (RIPNG_NODE, &no_ripng_redistribute_static_metric_val_cmd); + install_element (RIPNG_NODE, &ripng_redistribute_ospf6_metric_cmd); + install_element (RIPNG_NODE, &no_ripng_redistribute_ospf6_metric_cmd); + install_element (RIPNG_NODE, &no_ripng_redistribute_ospf6_metric_val_cmd); + install_element (RIPNG_NODE, &ripng_redistribute_bgp_metric_cmd); + install_element (RIPNG_NODE, &no_ripng_redistribute_bgp_metric_cmd); + install_element (RIPNG_NODE, &no_ripng_redistribute_bgp_metric_val_cmd); + install_element (RIPNG_NODE, &ripng_redistribute_kernel_routemap_cmd); + install_element (RIPNG_NODE, &no_ripng_redistribute_kernel_routemap_cmd); + install_element (RIPNG_NODE, &ripng_redistribute_connected_routemap_cmd); + install_element (RIPNG_NODE, &no_ripng_redistribute_connected_routemap_cmd); + install_element (RIPNG_NODE, &ripng_redistribute_static_routemap_cmd); + install_element (RIPNG_NODE, &no_ripng_redistribute_static_routemap_cmd); + install_element (RIPNG_NODE, &ripng_redistribute_ospf6_routemap_cmd); + install_element (RIPNG_NODE, &no_ripng_redistribute_ospf6_routemap_cmd); + install_element (RIPNG_NODE, &ripng_redistribute_bgp_routemap_cmd); + install_element (RIPNG_NODE, &no_ripng_redistribute_bgp_routemap_cmd); + install_element (RIPNG_NODE, &ripng_redistribute_kernel_metric_routemap_cmd); + install_element (RIPNG_NODE, + &no_ripng_redistribute_kernel_metric_routemap_cmd); + install_element (RIPNG_NODE, + &ripng_redistribute_connected_metric_routemap_cmd); + install_element (RIPNG_NODE, + &no_ripng_redistribute_connected_metric_routemap_cmd); + install_element (RIPNG_NODE, &ripng_redistribute_static_metric_routemap_cmd); + install_element (RIPNG_NODE, + &no_ripng_redistribute_static_metric_routemap_cmd); + install_element (RIPNG_NODE, &ripng_redistribute_ospf6_metric_routemap_cmd); + install_element (RIPNG_NODE, + &no_ripng_redistribute_ospf6_metric_routemap_cmd); + install_element (RIPNG_NODE, &ripng_redistribute_bgp_metric_routemap_cmd); + install_element (RIPNG_NODE, &no_ripng_redistribute_bgp_metric_routemap_cmd); +} -- cgit v1.2.1