Initial revision
diff --git a/bgpd/bgp_view.c b/bgpd/bgp_view.c
new file mode 100644
index 0000000..795d155
--- /dev/null
+++ b/bgpd/bgp_view.c
@@ -0,0 +1,258 @@
+/*
+ * $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 <zebra.h>
+
+#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);
+}