/* * $Id: bgp_view.c,v 1.1 2002/12/13 20:15:29 paul Exp $ * * Multiple view function for route server. * Copyright (C) 1997 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 "linklist.h" #include "vector.h" #include "vty.h" #include "command.h" #include "prefix.h" #include "zebra/zebra.h" #include "table.h" #include "log.h" #include "bgpd/bgpd.h" #include "bgpd/bgp_route.h" #include "bgpd/bgp_attr.h" #include "bgpd/bgp_dump.h" #include "bgpd/bgp_aspath.h" /* Static configuration of BGP annoucement. */ struct route_table *bgp_static_ipv4; #ifdef HAVE_IPV6 struct route_table *bgp_static_ipv6; #endif /* HAVE_IPV6 */ /* Static annoucement peer. */ struct peer *static_peer; /* Default value setting flag */ #define VAL_LOCAL_PREF 0x01 #define VAL_MED 0x02 #define VAL_NEXT_HOP 0x04 DEFUN (default_attr_localpref, default_attr_localpref_cmd, "default-attr local-pref NUMBER", "Set default local preference value\n" "Set default local preference value\n" "Value\n") { struct bgp *bgp; long lpref; bgp = (struct bgp *) vty->index; lpref = strtol (argv[0], NULL, 10); bgp->def |= VAL_LOCAL_PREF; bgp->localpref = lpref; return CMD_SUCCESS; } DEFUN (no_default_attr_localpref, no_default_attr_localpref_cmd, "no default-attr local-pref NUMBER", NO_STR "Unset default local preference value\n" "Unset default local preference value\n" "Value\n") { struct bgp *bgp; bgp = (struct bgp *) vty->index; bgp->def &= ~DEFAULT_LOCAL_PREF; bgp->localpref = 0; return CMD_SUCCESS; } #ifdef HAVE_IPV6 /* Network configuration for IPv6. */ int bgp_network_config_ipv6 (struct vty *vty, char *address_str) { int ret; struct prefix p; struct route_node *node; struct bgp_info *bgp_info; ret = str2prefix_ipv6 (address_str, (struct prefix_ipv6 *) &p); if (!ret) { vty_out (vty, "Please specify valid address\r\n"); return CMD_WARNING; } apply_mask_ipv6 ((struct prefix_ipv6 *) &p); node = route_node_get (bgp_static_ipv6, &p); if (node->info) { vty_out (vty, "There is already same static announcement.\r\n"); route_unlock_node (node); return CMD_WARNING; } bgp_info = bgp_info_new (); bgp_info->type = ZEBRA_ROUTE_STATIC; bgp_info->peer = static_peer; bgp_info->attr = bgp_attr_make_default (); node->info = bgp_info; nlri_process (&p, bgp_info); return CMD_SUCCESS; } #endif /* Configure static BGP network. */ DEFUN (bgp_network, bgp_network_cmd, "network PREFIX", "Announce network setup\n" "Static network for bgp announcement\n") { int ret; struct bgp *bgp; struct prefix p; struct route_node *node; struct bgp_info *bgp_info; bgp = (struct bgp *) vty->index; ret = str2prefix_ipv4 (argv[0], (struct prefix_ipv4 *) &p); if (!ret) { #ifdef HAVE_IPV6 return bgp_network_config_ipv6 (vty, argv[0]); #endif /* HAVE_IPV6 */ vty_out (vty, "Please specify address by a.b.c.d/mask\r\n"); return CMD_WARNING; } /* Make sure mask is applied. */ apply_mask ((struct prefix_ipv4 *) &p); node = route_node_get (bgp_static_ipv4, &p); if (node->info) { vty_out (vty, "There is already same static announcement.\r\n"); route_unlock_node (node); return CMD_WARNING; } bgp_info = bgp_info_new (); bgp_info->type = ZEBRA_ROUTE_STATIC; bgp_info->peer = static_peer; bgp_info->attr = bgp_attr_make_default (); node->info = bgp_info; nlri_process (&p, bgp_info); return CMD_SUCCESS; } DEFUN (no_bgp_network, no_bgp_network_cmd, "no network PREFIX", NO_STR "Announce network setup\n" "Delete static network for bgp announcement\n") { int ret; struct bgp *bgp; struct route_node *np; struct prefix_ipv4 p; bgp = (struct bgp *) vty->index; ret = str2prefix_ipv4 (argv[0], &p); if (!ret) { vty_out (vty, "Please specify address by a.b.c.d/mask\r\n"); return CMD_WARNING; } apply_mask (&p); np = route_node_get (bgp_static_ipv4, (struct prefix *) &p); if (!np->info) { vty_out (vty, "Can't find specified static route configuration.\r\n"); route_unlock_node (np); return CMD_WARNING; } nlri_delete (static_peer, (struct prefix *) &p); /* bgp_attr_free (np->info); */ np->info = NULL; route_unlock_node (np); return CMD_SUCCESS; } int config_write_network (struct vty *vty, struct bgp *bgp) { struct route_node *node; struct bgp_route *route; char buf[BUFSIZ]; for (node = route_top (bgp_static_ipv4); node; node = route_next (node)) for (route = node->info; route; route = route->next) vty_out (vty, " network %s/%d%s", inet_ntoa (node->p.u.prefix4), node->p.prefixlen, VTY_NEWLINE); #ifdef HAVE_IPV6 for (node = route_top (bgp_static_ipv6); node; node = route_next (node)) for (route = node->info; route; route = route->next) vty_out (vty, " network %s/%d%s", inet_ntop (AF_INET6, &node->p.u.prefix6, buf, BUFSIZ), node->p.prefixlen, VTY_NEWLINE); #endif /* HAVE_IPV6 */ return 0; } void view_init () { bgp_static_ipv4 = route_table_init (); #ifdef HAVE_IPV6 bgp_static_ipv6 = route_table_init (); #endif /* HAVE_IPV6 */ static_peer = peer_new (); static_peer->host = "Static annucement"; install_element (BGP_NODE, &bgp_network_cmd); install_element (BGP_NODE, &no_bgp_network_cmd); install_element (BGP_NODE, &default_attr_localpref_cmd); install_element (BGP_NODE, &no_default_attr_localpref_cmd); }