From: Florian Fainelli Date: Sat, 22 Nov 2008 19:31:39 +0000 (+0000) Subject: Add multipath caching policy patch to quagga-unstable (#1608) X-Git-Url: http://git.openwrt.org/?p=openwrt%2Fsvn-archive%2Farchive.git;a=commitdiff_plain;h=b02ab37d78fe92a8f559e9a51b181b3fa5f42cb9 Add multipath caching policy patch to quagga-unstable (#1608) SVN-Revision: 13315 --- diff --git a/net/quagga-unstable/Makefile b/net/quagga-unstable/Makefile index 7e7425dbe3..f2a424a388 100644 --- a/net/quagga-unstable/Makefile +++ b/net/quagga-unstable/Makefile @@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=quagga-unstable PKG_VERSION:=0.99.11 -PKG_RELEASE:=1 +PKG_RELEASE:=2 PKG_MD5SUM:=903e40c744730ad4d62bee872eeb813b PKG_SOURCE_URL:=http://www.quagga.net/download/ \ diff --git a/net/quagga-unstable/patches/100-quagga_multipath_caching_policy.patch b/net/quagga-unstable/patches/100-quagga_multipath_caching_policy.patch new file mode 100644 index 0000000000..1213b040f3 --- /dev/null +++ b/net/quagga-unstable/patches/100-quagga_multipath_caching_policy.patch @@ -0,0 +1,305 @@ +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 ++#endif /* HAVE_LINUX_IP_MP_ALG_H */ ++ + #ifdef HAVE_NETDB_H + #include + #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 ++ ++#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;