packages/net/quagga-unstable/patches/100-quagga_multipath_caching_policy.patch
florian 3e102d0da5 Add multipath caching policy patch to quagga-unstable (#1608)
git-svn-id: svn://svn.openwrt.org/openwrt/packages@13315 3c298f89-4303-0410-b956-a3cf2f4a3e73
2008-11-22 19:31:39 +00:00

306 lines
9.1 KiB
Diff
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

diff -urN quagga-0.99.11/configure.ac quagga-0.99.11.new/configure.ac
--- quagga-0.99.11/configure.ac 2008-10-02 10:31:09.000000000 +0200
+++ quagga-0.99.11.new/configure.ac 2008-11-22 20:58:12.000000000 +0100
@@ -385,7 +385,7 @@
AC_CHECK_HEADERS([stropts.h sys/ksym.h sys/times.h sys/select.h \
sys/types.h linux/version.h netdb.h asm/types.h \
sys/param.h limits.h signal.h libutil.h \
- sys/socket.h netinet/in.h])
+ sys/socket.h netinet/in.h linux/ip_mp_alg.h])
dnl Utility macro to avoid retyping includes all the time
m4_define([QUAGGA_INCLUDES],
@@ -755,6 +755,17 @@
AC_SUBST(KERNEL_METHOD)
AC_SUBST(OTHER_METHOD)
+dnl ----------
+dnl Check for RTA_MP_ALGO in linux/rtnetlink.h
+dnl ----------
+AC_MSG_CHECKING(for support of multipath alg. in netlink)
+ if grep RTA_MP_ALGO linux/rtnetlink.h >/dev/null 2>&1; then
+ AC_DEFINE(HAVE_RT_MP_ALGO,,RTA_MP exist in rtnetlink)
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT(no)
+ fi
+
dnl --------------------------
dnl Determine IS-IS I/O method
dnl --------------------------
diff -urN quagga-0.99.11/lib/command.h quagga-0.99.11.new/lib/command.h
--- quagga-0.99.11/lib/command.h 2008-09-09 22:18:57.000000000 +0200
+++ quagga-0.99.11.new/lib/command.h 2008-11-22 20:48:07.000000000 +0100
@@ -101,6 +101,7 @@
DUMP_NODE, /* Packet dump node. */
FORWARDING_NODE, /* IP forwarding node. */
PROTOCOL_NODE, /* protocol filtering node */
+ MULTIPATH_NODE, /* Multipath policy node */
VTY_NODE, /* Vty node. */
};
@@ -272,6 +273,7 @@
/* Common descriptions. */
#define SHOW_STR "Show running system information\n"
#define IP_STR "IP information\n"
+#define MULTIPATH_STR "Configure multipath policy\n"
#define IPV6_STR "IPv6 information\n"
#define NO_STR "Negate a command or set its defaults\n"
#define REDIST_STR "Redistribute information from another routing protocol\n"
diff -urN quagga-0.99.11/lib/zebra.h quagga-0.99.11.new/lib/zebra.h
--- quagga-0.99.11/lib/zebra.h 2008-09-24 17:22:51.000000000 +0200
+++ quagga-0.99.11.new/lib/zebra.h 2008-11-22 20:48:44.000000000 +0100
@@ -168,6 +168,10 @@
#define RT_TABLE_MAIN 0
#endif /* HAVE_NETLINK */
+#ifdef HAVE_LINUX_IP_MP_ALG_H
+#include <linux/ip_mp_alg.h>
+#endif /* HAVE_LINUX_IP_MP_ALG_H */
+
#ifdef HAVE_NETDB_H
#include <netdb.h>
#endif /* HAVE_NETDB_H */
diff -urN quagga-0.99.11/zebra/main.c quagga-0.99.11.new/zebra/main.c
--- quagga-0.99.11/zebra/main.c 2008-09-05 16:27:26.000000000 +0200
+++ quagga-0.99.11.new/zebra/main.c 2008-11-22 20:48:44.000000000 +0100
@@ -44,6 +44,7 @@
struct zebra_t zebrad =
{
.rtm_table_default = 0,
+ .mpath = 0,
};
/* process id. */
diff -urN quagga-0.99.11/zebra/multipath.h quagga-0.99.11.new/zebra/multipath.h
--- quagga-0.99.11/zebra/multipath.h 1970-01-01 01:00:00.000000000 +0100
+++ quagga-0.99.11.new/zebra/multipath.h 2008-11-22 20:48:44.000000000 +0100
@@ -0,0 +1,37 @@
+/*
+ * multipath policy names.
+ *
+ * This file is part of Quagga routing suite.
+ *
+ * Quagga 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.
+ *
+ * Quagga 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.
+ */
+
+#ifndef ZEBRA_MULTIPATH_H
+#define ZEBRA_MULTIPATH_H
+#include <zebra.h>
+
+#ifdef HAVE_LINUX_IP_MP_ALG_H
+
+static char *mp_alg_names[IP_MP_ALG_MAX+1] = {
+ [IP_MP_ALG_NONE] = "none",
+ [IP_MP_ALG_RR] = "rr",
+ [IP_MP_ALG_DRR] = "drr",
+ [IP_MP_ALG_RANDOM] = "random",
+ [IP_MP_ALG_WRANDOM] = "wrandom"
+ };
+#endif
+#endif
+
diff -urN quagga-0.99.11/zebra/rt_netlink.c quagga-0.99.11.new/zebra/rt_netlink.c
--- quagga-0.99.11/zebra/rt_netlink.c 2008-09-05 16:27:26.000000000 +0200
+++ quagga-0.99.11.new/zebra/rt_netlink.c 2008-11-22 20:48:44.000000000 +0100
@@ -36,6 +36,7 @@
#include "thread.h"
#include "privs.h"
+#include "multipath.h"
#include "zebra/zserv.h"
#include "zebra/rt.h"
#include "zebra/redistribute.h"
@@ -1694,6 +1695,16 @@
if (src)
addattr_l (&req.n, sizeof req, RTA_PREFSRC, &src->ipv4, bytelen);
+#ifdef HAVE_RT_MP_ALGO
+ if (zebrad.mpath != IP_MP_ALG_NONE)
+ {
+ if (IS_ZEBRA_DEBUG_KERNEL)
+ zlog_debug("netlink_route_multipath() (multihop): "
+ "multipath policy : %s",mp_alg_names[zebrad.mpath]);
+
+ addattr_l (&req.n, 1024, RTA_MP_ALGO, &zebrad.mpath, sizeof(zebrad.mpath));
+ }
+#endif
if (rta->rta_len > RTA_LENGTH (0))
addattr_l (&req.n, 1024, RTA_MULTIPATH, RTA_DATA (rta),
RTA_PAYLOAD (rta));
diff -urN quagga-0.99.11/zebra/zserv.c quagga-0.99.11.new/zebra/zserv.c
--- quagga-0.99.11/zebra/zserv.c 2008-09-24 17:22:51.000000000 +0200
+++ quagga-0.99.11.new/zebra/zserv.c 2008-11-22 20:48:44.000000000 +0100
@@ -36,6 +36,7 @@
#include "privs.h"
#include "network.h"
#include "buffer.h"
+#include "multipath.h"
#include "zebra/zserv.h"
#include "zebra/router-id.h"
@@ -1120,6 +1121,9 @@
/* Set table number. */
client->rtm_table = zebrad.rtm_table_default;
+ /* Set multipath policy */
+ client->mpath = zebrad.mpath;
+
/* Add this client to linked list. */
listnode_add (zebrad.client_list, client);
@@ -1697,6 +1701,91 @@
};
+#ifdef HAVE_RT_MP_ALGO
+DEFUN (multipath_rr,
+ multipath_rr_cmd,
+ "multipath rr",
+ MULTIPATH_STR
+ "Round Robin multipath policy")
+{
+ zebrad.mpath=IP_MP_ALG_RR;
+ return CMD_SUCCESS;
+}
+
+DEFUN (multipath_drr,
+ multipath_drr_cmd,
+ "multipath drr",
+ MULTIPATH_STR
+ "Device round robin multipath policy")
+{
+ zebrad.mpath=IP_MP_ALG_DRR;
+ return CMD_SUCCESS;
+}
+
+DEFUN (multipath_random,
+ multipath_random_cmd,
+ "multipath random",
+ MULTIPATH_STR
+ "Random multipath policy")
+{
+ zebrad.mpath=IP_MP_ALG_RANDOM;
+ return CMD_SUCCESS;
+}
+
+DEFUN (multipath_wrandom,
+ multipath_wrandom_cmd,
+ "multipath wrandom",
+ MULTIPATH_STR
+ "Weighted random multipath policy")
+{
+ zebrad.mpath=IP_MP_ALG_WRANDOM;
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_multipath,
+ no_multipath_cmd,
+ "no multipath",
+ NO_STR
+ MULTIPATH_STR
+ "Remove multipath policy")
+{
+ zebrad.mpath=IP_MP_ALG_NONE;
+ return CMD_SUCCESS;
+}
+
+DEFUN (show_multipath,
+ show_multipath_cmd,
+ "show multipath",
+ SHOW_STR
+ "Show multipath policy")
+{
+ vty_out (vty, "multipath %s%s", mp_alg_names[zebrad.mpath],
+ VTY_NEWLINE);
+ return CMD_SUCCESS;
+}
+
+/* multipath policy configuration write function. */
+static int
+config_write_multipath (struct vty *vty)
+{
+
+
+ if (zebrad.mpath)
+ vty_out (vty, "multipath %s%s", mp_alg_names[zebrad.mpath],
+ VTY_NEWLINE);
+ return 0;
+}
+
+/* table node for multipath policy. */
+struct cmd_node multipath_node =
+{
+ MULTIPATH_NODE,
+ "",
+ 1
+};
+
+#endif /* HAVE_RT_MP_ALGO */
+
/* Initialisation of zebra and installation of commands. */
void
zebra_init (void)
@@ -1715,6 +1804,10 @@
install_node (&table_node, config_write_table);
install_node (&forwarding_node, config_write_forwarding);
+#ifdef HAVE_RT_MP_ALGO
+ install_node (&multipath_node, config_write_multipath);
+#endif
+
install_element (VIEW_NODE, &show_ip_forwarding_cmd);
install_element (ENABLE_NODE, &show_ip_forwarding_cmd);
install_element (CONFIG_NODE, &ip_forwarding_cmd);
@@ -1725,6 +1818,14 @@
install_element (VIEW_NODE, &show_table_cmd);
install_element (ENABLE_NODE, &show_table_cmd);
install_element (CONFIG_NODE, &config_table_cmd);
+#ifdef HAVE_RT_MP_ALGO
+ install_element (CONFIG_NODE, &multipath_rr_cmd);
+ install_element (CONFIG_NODE, &multipath_drr_cmd);
+ install_element (CONFIG_NODE, &multipath_random_cmd);
+ install_element (CONFIG_NODE, &multipath_wrandom_cmd);
+ install_element (CONFIG_NODE, &no_multipath_cmd);
+ install_element (ENABLE_NODE, &show_multipath_cmd);
+#endif /* HAVE_RT_MP_ALGO */
#endif /* HAVE_NETLINK */
#ifdef HAVE_IPV6
diff -urN quagga-0.99.11/zebra/zserv.h quagga-0.99.11.new/zebra/zserv.h
--- quagga-0.99.11/zebra/zserv.h 2008-09-24 17:22:51.000000000 +0200
+++ quagga-0.99.11.new/zebra/zserv.h 2008-11-22 20:48:44.000000000 +0100
@@ -55,6 +55,9 @@
/* default routing table this client munges */
int rtm_table;
+ /* multipath policy */
+ u_int32_t mpath;
+
/* This client's redistribute flag. */
u_char redist[ZEBRA_ROUTE_MAX];
@@ -78,6 +81,9 @@
/* default table */
int rtm_table_default;
+ /* multipath policy */
+ u_int32_t mpath;
+
/* rib work queue */
struct work_queue *ribq;
struct meta_queue *mq;