Add multipath caching policy patch to quagga-unstable (#1608)
authorFlorian Fainelli <florian@openwrt.org>
Sat, 22 Nov 2008 19:31:39 +0000 (19:31 +0000)
committerFlorian Fainelli <florian@openwrt.org>
Sat, 22 Nov 2008 19:31:39 +0000 (19:31 +0000)
SVN-Revision: 13315

net/quagga-unstable/Makefile
net/quagga-unstable/patches/100-quagga_multipath_caching_policy.patch [new file with mode: 0644]

index 7e7425d..f2a424a 100644 (file)
@@ -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 (file)
index 0000000..1213b04
--- /dev/null
@@ -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 <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 @@
+ };
\f
++#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;